From 75cd8029b98feacee6f5a353434d1c0d7a571c9e Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 13 Sep 2026 16:40:42 +0200 Subject: [PATCH] fix(quickadapter): release annotation RPC custom-data sessions --- quickadapter/.basedpyright/diagnostics.json | 352 +++++++++--------- .../user_data/strategies/QuickAdapterV3.py | 56 ++- 2 files changed, 231 insertions(+), 177 deletions(-) diff --git a/quickadapter/.basedpyright/diagnostics.json b/quickadapter/.basedpyright/diagnostics.json index 40707a6..4cf0258 100644 --- a/quickadapter/.basedpyright/diagnostics.json +++ b/quickadapter/.basedpyright/diagnostics.json @@ -993,883 +993,883 @@ }, { "endCharacter": 55, - "endLine": 168, + "endLine": 220, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Type \"int\" is not assignable to declared type \"cached_property[int]\"\n  \"int\" is not assignable to \"cached_property[int]\"", "rule": "reportAssignmentType", "severity": "error", "startCharacter": 24, - "startLine": 168 + "startLine": 220 }, { "endCharacter": 15, - "endLine": 204, + "endLine": 256, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Class variable \"minimal_roi\" overrides instance variable of same name in class \"IStrategy\"", "rule": "reportIncompatibleVariableOverride", "severity": "error", "startCharacter": 4, - "startLine": 204 + "startLine": 256 }, { "endCharacter": 72, - "endLine": 204, + "endLine": 256, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"*\" not supported for types \"cached_property[int]\" and \"Literal[864]\"", "rule": "reportOperatorIssue", "severity": "error", "startCharacter": 49, - "startLine": 204 + "startLine": 256 }, { "endCharacter": 64, - "endLine": 214, + "endLine": 268, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"timeframe_to_minutes\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 36, - "startLine": 214 + "startLine": 268 }, { "endCharacter": 17, - "endLine": 223, + "endLine": 277, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "\"can_short\" overrides symbol of same name in class \"IStrategy\"\n  \"property\" is not assignable to \"bool\"", "rule": "reportIncompatibleVariableOverride", "severity": "error", "startCharacter": 8, - "startLine": 223 + "startLine": 277 }, { "endCharacter": 19, - "endLine": 227, + "endLine": 281, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "\"plot_config\" overrides symbol of same name in class \"IStrategy\"\n  \"cached_property[dict[str, Any]]\" is not assignable to \"dict[Unknown, Unknown]\"", "rule": "reportIncompatibleVariableOverride", "severity": "error", "startCharacter": 8, - "startLine": 227 + "startLine": 281 }, { "endCharacter": 19, - "endLine": 271, + "endLine": 325, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "\"protections\" overrides symbol of same name in class \"IStrategy\"\n  \"cached_property[list[dict[str, Any]]]\" is not assignable to \"list[Unknown]\"", "rule": "reportIncompatibleVariableOverride", "severity": "error", "startCharacter": 8, - "startLine": 271 + "startLine": 325 }, { "endCharacter": 28, - "endLine": 344, + "endLine": 398, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "\"startup_candle_count\" overrides symbol of same name in class \"IStrategy\"\n  \"property\" is not assignable to \"int\"", "rule": "reportIncompatibleVariableOverride", "severity": "error", "startCharacter": 8, - "startLine": 344 + "startLine": 398 }, { "endCharacter": 44, - "endLine": 403, + "endLine": 457, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"/\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 12, - "startLine": 403 + "startLine": 457 }, { "endCharacter": 38, - "endLine": 656, + "endLine": 710, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "\"to_numpy\" is not a known attribute of \"None\"", "rule": "reportOptionalMemberAccess", "severity": "error", "startCharacter": 30, - "startLine": 656 + "startLine": 710 }, { "endCharacter": 44, - "endLine": 689, + "endLine": 743, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"-\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 38, - "startLine": 689 + "startLine": 743 }, { "endCharacter": 38, - "endLine": 697, + "endLine": 751, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Object of type \"None\" is not subscriptable", "rule": "reportOptionalSubscript", "severity": "error", "startCharacter": 36, - "startLine": 697 + "startLine": 751 }, { "endCharacter": 39, - "endLine": 698, + "endLine": 752, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Object of type \"None\" is not subscriptable", "rule": "reportOptionalSubscript", "severity": "error", "startCharacter": 37, - "startLine": 698 + "startLine": 752 }, { "endCharacter": 38, - "endLine": 699, + "endLine": 753, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Object of type \"None\" is not subscriptable", "rule": "reportOptionalSubscript", "severity": "error", "startCharacter": 36, - "startLine": 699 + "startLine": 753 }, { "endCharacter": 44, - "endLine": 722, + "endLine": 776, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"-\" not supported for types \"Series[Any] | None\" and \"Series[Any] | None\"\n  Operator \"-\" not supported for types \"Series[Any]\" and \"None\"\n  Operator \"-\" not supported for types \"None\" and \"Series[Any]\"\n  Operator \"-\" not supported for types \"None\" and \"None\"", "rule": "reportOperatorIssue", "severity": "error", "startCharacter": 29, - "startLine": 722 + "startLine": 776 }, { "endCharacter": 66, - "endLine": 722, + "endLine": 776, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"s1\" of type \"Series[Any]\" in function \"non_zero_diff\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 61, - "startLine": 722 + "startLine": 776 }, { "endCharacter": 72, - "endLine": 722, + "endLine": 776, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"s2\" of type \"Series[Any]\" in function \"non_zero_diff\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 68, - "startLine": 722 + "startLine": 776 }, { "endCharacter": 56, - "endLine": 726, + "endLine": 780, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 50, - "startLine": 726 + "startLine": 780 }, { "endCharacter": 58, - "endLine": 727, + "endLine": 781, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 52, - "startLine": 727 + "startLine": 781 }, { "endCharacter": 57, - "endLine": 728, + "endLine": 782, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 51, - "startLine": 728 + "startLine": 782 }, { "endCharacter": 44, - "endLine": 731, + "endLine": 785, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"zlema\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 38, - "startLine": 731 + "startLine": 785 }, { "endCharacter": 44, - "endLine": 732, + "endLine": 786, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"zlema\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 38, - "startLine": 732 + "startLine": 786 }, { "endCharacter": 44, - "endLine": 733, + "endLine": 787, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"zlema\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 38, - "startLine": 733 + "startLine": 787 }, { "endCharacter": 61, - "endLine": 734, + "endLine": 788, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 55, - "startLine": 734 + "startLine": 788 }, { "endCharacter": 61, - "endLine": 735, + "endLine": 789, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 55, - "startLine": 735 + "startLine": 789 }, { "endCharacter": 61, - "endLine": 736, + "endLine": 790, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 55, - "startLine": 736 + "startLine": 790 }, { "endCharacter": 81, - "endLine": 744, + "endLine": 798, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any]\" cannot be assigned to parameter \"p2\" of type \"T@get_distance\" in function \"get_distance\"\n  \"Series[Any]\" is not assignable to \"float\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 58, - "startLine": 744 + "startLine": 798 }, { "endCharacter": 67, - "endLine": 757, + "endLine": 811, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 61, - "startLine": 757 + "startLine": 811 }, { "endCharacter": 68, - "endLine": 758, + "endLine": 812, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 62, - "startLine": 758 + "startLine": 812 }, { "endCharacter": 67, - "endLine": 759, + "endLine": 813, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 61, - "startLine": 759 + "startLine": 813 }, { "endCharacter": 44, - "endLine": 760, + "endLine": 814, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"-\" not supported for types \"Series[Any] | None\" and \"Series[Any] | None\"\n  Operator \"-\" not supported for types \"Series[Any]\" and \"None\" when expected type is \"_SetItemValueNotDataFrame\"\n  Operator \"-\" not supported for types \"None\" and \"Series[Any]\" when expected type is \"_SetItemValueNotDataFrame\"\n  Operator \"-\" not supported for types \"None\" and \"None\" when expected type is \"_SetItemValueNotDataFrame\"", "rule": "reportOperatorIssue", "severity": "error", "startCharacter": 30, - "startLine": 760 + "startLine": 814 }, { "endCharacter": 56, - "endLine": 761, + "endLine": 815, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "No overloads for \"__call__\" match the provided arguments", "rule": "reportCallIssue", "severity": "error", "startCharacter": 31, - "startLine": 761 + "startLine": 815 }, { "endCharacter": 47, - "endLine": 761, + "endLine": 815, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x1\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 42, - "startLine": 761 + "startLine": 815 }, { "endCharacter": 55, - "endLine": 761, + "endLine": 815, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x2\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 49, - "startLine": 761 + "startLine": 815 }, { "endCharacter": 64, - "endLine": 762, + "endLine": 816, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "No overloads for \"__call__\" match the provided arguments", "rule": "reportCallIssue", "severity": "error", "startCharacter": 39, - "startLine": 762 + "startLine": 816 }, { "endCharacter": 55, - "endLine": 762, + "endLine": 816, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x1\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 50, - "startLine": 762 + "startLine": 816 }, { "endCharacter": 63, - "endLine": 762, + "endLine": 816, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x2\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 57, - "startLine": 762 + "startLine": 816 }, { "endCharacter": 55, - "endLine": 770, + "endLine": 824, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 49, - "startLine": 770 + "startLine": 824 }, { "endCharacter": 55, - "endLine": 771, + "endLine": 825, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 49, - "startLine": 771 + "startLine": 825 }, { "endCharacter": 55, - "endLine": 772, + "endLine": 826, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 49, - "startLine": 772 + "startLine": 826 }, { "endCharacter": 55, - "endLine": 773, + "endLine": 827, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 49, - "startLine": 773 + "startLine": 827 }, { "endCharacter": 55, - "endLine": 774, + "endLine": 828, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 49, - "startLine": 774 + "startLine": 828 }, { "endCharacter": 55, - "endLine": 775, + "endLine": 829, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 49, - "startLine": 775 + "startLine": 829 }, { "endCharacter": 50, - "endLine": 804, + "endLine": 858, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 44, - "startLine": 804 + "startLine": 858 }, { "endCharacter": 50, - "endLine": 804, + "endLine": 858, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 44, - "startLine": 804 + "startLine": 858 }, { "endCharacter": 29, - "endLine": 805, + "endLine": 859, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 23, - "startLine": 805 + "startLine": 859 }, { "endCharacter": 29, - "endLine": 805, + "endLine": 859, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 23, - "startLine": 805 + "startLine": 859 }, { "endCharacter": 60, - "endLine": 842, + "endLine": 896, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 50, - "startLine": 842 + "startLine": 896 }, { "endCharacter": 60, - "endLine": 842, + "endLine": 896, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 50, - "startLine": 842 + "startLine": 896 }, { "endCharacter": 35, - "endLine": 843, + "endLine": 897, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 25, - "startLine": 843 + "startLine": 897 }, { "endCharacter": 35, - "endLine": 843, + "endLine": 897, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 25, - "startLine": 843 + "startLine": 897 }, { "endCharacter": 41, - "endLine": 1065, + "endLine": 1119, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"<\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 12, - "startLine": 1065 + "startLine": 1119 }, { "endCharacter": 41, - "endLine": 1075, + "endLine": 1129, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \">\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 12, - "startLine": 1075 + "startLine": 1129 }, { "endCharacter": 66, - "endLine": 1088, + "endLine": 1142, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"timeframe_to_prev_date\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 38, - "startLine": 1088 + "startLine": 1142 }, { "endCharacter": 73, - "endLine": 1219, + "endLine": 1273, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Expected 1 more positional argument", "rule": "reportCallIssue", "severity": "error", "startCharacter": 51, - "startLine": 1219 + "startLine": 1273 }, { "endCharacter": 74, - "endLine": 1283, + "endLine": 1337, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"int | None\" cannot be assigned to parameter \"trade_duration_candles\" of type \"int\" in function \"get_trade_natr\"\n  Type \"int | None\" is not assignable to type \"int\"\n    \"None\" is not assignable to \"int\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 52, - "startLine": 1283 + "startLine": 1337 }, { "endCharacter": 74, - "endLine": 1310, + "endLine": 1364, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"int | None\" cannot be assigned to parameter \"trade_duration_candles\" of type \"int\" in function \"get_trade_natr\"\n  Type \"int | None\" is not assignable to type \"int\"\n    \"None\" is not assignable to \"int\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 52, - "startLine": 1310 + "startLine": 1364 }, { "endCharacter": 96, - "endLine": 1358, + "endLine": 1412, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 68, - "startLine": 1358 + "startLine": 1412 }, { "endCharacter": 77, - "endLine": 1392, + "endLine": 1446, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"<=\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 57, - "startLine": 1392 + "startLine": 1446 }, { "endCharacter": 9, - "endLine": 1397, + "endLine": 1451, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"+\" not supported for types \"float\" and \"float | None\"\n  Operator \"+\" not supported for types \"float\" and \"None\"", "rule": "reportOperatorIssue", "severity": "error", "startCharacter": 28, - "startLine": 1395 + "startLine": 1449 }, { "endCharacter": 33, - "endLine": 1396, + "endLine": 1450, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"-\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 13, - "startLine": 1396 + "startLine": 1450 }, { "endCharacter": 67, - "endLine": 1402, + "endLine": 1456, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 47, - "startLine": 1402 + "startLine": 1456 }, { "endCharacter": 67, - "endLine": 1402, + "endLine": 1456, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n ...", "rule": "reportArgumentType", "severity": "error", "startCharacter": 47, - "startLine": 1402 + "startLine": 1456 }, { "endCharacter": 64, - "endLine": 1556, + "endLine": 1610, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "\"isoformat\" is not a known attribute of \"None\"", "rule": "reportOptionalMemberAccess", "severity": "error", "startCharacter": 55, - "startLine": 1556 + "startLine": 1610 }, { "endCharacter": 37, - "endLine": 1607, + "endLine": 1661, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"<=\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 15, - "startLine": 1607 + "startLine": 1661 }, { "endCharacter": 48, - "endLine": 1609, + "endLine": 1663, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"<=\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 15, - "startLine": 1609 + "startLine": 1663 }, { "endCharacter": 96, - "endLine": 1789, + "endLine": 1843, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 68, - "startLine": 1789 + "startLine": 1843 }, { "endCharacter": 39, - "endLine": 1855, + "endLine": 1909, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"+\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 21, - "startLine": 1855 + "startLine": 1909 }, { "endCharacter": 90, - "endLine": 1855, + "endLine": 1909, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"*\" not supported for types \"float\" and \"Any | None\"\n  Operator \"*\" not supported for types \"float\" and \"None\"", "rule": "reportOperatorIssue", "severity": "error", "startCharacter": 62, - "startLine": 1855 + "startLine": 1909 }, { "endCharacter": 96, - "endLine": 2154, + "endLine": 2208, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 68, - "startLine": 2154 + "startLine": 2208 }, { "endCharacter": 85, - "endLine": 2179, + "endLine": 2233, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "\"isoformat\" is not a known attribute of \"None\"", "rule": "reportOptionalMemberAccess", "severity": "error", "startCharacter": 76, - "startLine": 2179 + "startLine": 2233 }, { "endCharacter": 47, - "endLine": 2185, + "endLine": 2239, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \"<\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 16, - "startLine": 2185 + "startLine": 2239 }, { "endCharacter": 42, - "endLine": 2189, + "endLine": 2243, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"str\" cannot be assigned to parameter \"side\" of type \"TradeDirection\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"TradeDirection\"\n    \"str\" is not assignable to type \"Literal['long']\"\n    \"str\" is not assignable to type \"Literal['short']\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2189 + "startLine": 2243 }, { "endCharacter": 42, - "endLine": 2190, + "endLine": 2244, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"str\" cannot be assigned to parameter \"order\" of type \"OrderType\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"OrderType\"\n    \"str\" is not assignable to type \"Literal['entry']\"\n    \"str\" is not assignable to type \"Literal['exit']\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2190 + "startLine": 2244 }, { "endCharacter": 69, - "endLine": 2192, + "endLine": 2246, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"int | float\" cannot be assigned to parameter \"lookback_period_candles\" of type \"int\" in function \"reversal_confirmed\"\n  Type \"int | float\" is not assignable to type \"int\"\n    \"float\" is not assignable to \"int\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2192 + "startLine": 2246 }, { "endCharacter": 47, - "endLine": 2203, + "endLine": 2257, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Operator \">\" not supported for \"None\"", "rule": "reportOptionalOperand", "severity": "error", "startCharacter": 16, - "startLine": 2203 + "startLine": 2257 }, { "endCharacter": 43, - "endLine": 2207, + "endLine": 2261, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"str\" cannot be assigned to parameter \"side\" of type \"TradeDirection\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"TradeDirection\"\n    \"str\" is not assignable to type \"Literal['long']\"\n    \"str\" is not assignable to type \"Literal['short']\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2207 + "startLine": 2261 }, { "endCharacter": 42, - "endLine": 2208, + "endLine": 2262, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"str\" cannot be assigned to parameter \"order\" of type \"OrderType\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"OrderType\"\n    \"str\" is not assignable to type \"Literal['entry']\"\n    \"str\" is not assignable to type \"Literal['exit']\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2208 + "startLine": 2262 }, { "endCharacter": 69, - "endLine": 2210, + "endLine": 2264, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"int | float\" cannot be assigned to parameter \"lookback_period_candles\" of type \"int\" in function \"reversal_confirmed\"\n  Type \"int | float\" is not assignable to type \"int\"\n    \"float\" is not assignable to \"int\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2210 + "startLine": 2264 }, { "endCharacter": 52, - "endLine": 2239, + "endLine": 2293, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"datetime | None\" cannot be assigned to parameter \"current_candle_date\" of type \"datetime\" in function \"_normalize_final_take_profit_state\"\n  Type \"datetime | None\" is not assignable to type \"datetime\"\n    \"None\" is not assignable to \"datetime\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 36, - "startLine": 2239 + "startLine": 2293 }, { "endCharacter": 96, - "endLine": 2359, + "endLine": 2413, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 68, - "startLine": 2359 + "startLine": 2413 }, { "endCharacter": 43, - "endLine": 2368, + "endLine": 2422, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"str\" cannot be assigned to parameter \"order\" of type \"OrderType\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"OrderType\"\n    \"str\" is not assignable to type \"Literal['entry']\"\n    \"str\" is not assignable to type \"Literal['exit']\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2368 + "startLine": 2422 }, { "endCharacter": 69, - "endLine": 2370, + "endLine": 2424, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"int | float\" cannot be assigned to parameter \"lookback_period_candles\" of type \"int\" in function \"reversal_confirmed\"\n  Type \"int | float\" is not assignable to type \"int\"\n    \"float\" is not assignable to \"int\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 16, - "startLine": 2370 + "startLine": 2424 }, { "endCharacter": 32, - "endLine": 2446, + "endLine": 2500, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_trade_annotation_line_start_date\"\n  \"LocalTrade\" is not assignable to \"Trade\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 27, - "startLine": 2446 + "startLine": 2500 }, { "endCharacter": 72, - "endLine": 2449, + "endLine": 2503, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_trade_exit_stage\"\n  \"LocalTrade\" is not assignable to \"Trade\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 67, - "startLine": 2449 + "startLine": 2503 }, { "endCharacter": 36, - "endLine": 2456, + "endLine": 2510, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_take_profit_target\"\n  \"LocalTrade\" is not assignable to \"Trade\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 31, - "startLine": 2456 + "startLine": 2510 }, { "endCharacter": 71, - "endLine": 2487, + "endLine": 2541, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_trade_entry_date\"\n  \"LocalTrade\" is not assignable to \"Trade\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 66, - "startLine": 2487 + "startLine": 2541 }, { "endCharacter": 32, - "endLine": 2518, + "endLine": 2572, "file": "quickadapter/user_data/strategies/QuickAdapterV3.py", "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_take_profit_target\"\n  \"LocalTrade\" is not assignable to \"Trade\"", "rule": "reportArgumentType", "severity": "error", "startCharacter": 27, - "startLine": 2518 + "startLine": 2572 }, { "endCharacter": 34, diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 2c4e4f8..78db623 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -3,7 +3,7 @@ import hashlib import logging import math from collections.abc import Callable -from functools import cached_property, lru_cache, reduce +from functools import cached_property, lru_cache, reduce, wraps from pathlib import Path from typing import ( Any, @@ -114,6 +114,58 @@ class _FinalTakeProfitState(TypedDict): logger = logging.getLogger(__name__) +_RPC_CUSTOM_DATA_SENTINEL = "_quickadapter_rpc_custom_data_cleanup_patched" + + +def _install_rpc_custom_data_cleanup_patch() -> None: + """Release the separate custom-data session leaked by Freqtrade 2026.8 annotations. + + Recheck RPC and request-context contracts on Freqtrade upgrades. Removal is + harmless after upstream cleanup; a shared Trade session remains API-owned. + """ + from inspect import iscoroutinefunction + + from freqtrade.persistence.custom_data import _CustomData + from freqtrade.persistence.models import _request_id_ctx_var + from freqtrade.rpc.rpc import RPC + + original = RPC._rpc_analysed_dataframe + current = original + while True: + if getattr(current, _RPC_CUSTOM_DATA_SENTINEL, False): + return + wrapped = getattr(current, "__wrapped__", None) + if wrapped is None: + break + current = wrapped + if iscoroutinefunction(original): + raise RuntimeError("QuickAdapter RPC cleanup requires a synchronous annotation RPC") + + @wraps(original) + def analysed_dataframe(self, *args, **kwargs): + if _request_id_ctx_var.get() is None: + return original(self, *args, **kwargs) + failed = False + try: + return original(self, *args, **kwargs) + except BaseException: + failed = True + raise + finally: + try: + session = _CustomData.session + if session is not Trade.session: + session.remove() + except Exception: + if not failed: + raise + logger.exception("Custom-data session cleanup failed after annotation RPC error") + + setattr(analysed_dataframe, _RPC_CUSTOM_DATA_SENTINEL, True) + RPC._rpc_analysed_dataframe = analysed_dataframe + logger.info("Installed QuickAdapter annotation RPC custom-data session cleanup") + + class QuickAdapterV3(IStrategy): """ The following freqtrade strategy is released to sponsors of the non-profit FreqAI open-source project. @@ -209,6 +261,8 @@ class QuickAdapterV3(IStrategy): def __init__(self, config: dict[str, Any], *args, **kwargs) -> None: super().__init__(config, *args, **kwargs) migrate_config(self.config, logger) + if self.is_trade_runmode and self.config.get("api_server", {}).get("enabled", False): + _install_rpc_custom_data_cleanup_patch() @cached_property def timeframe_minutes(self) -> int: -- 2.53.0