{"record":{"id":"810363425b5c1852","repo":"QuantConnect/Lean","slug":"fee-rate-should-be-0-0025-but-was-feerate","errorCode":null,"errorMessage":"Fee rate should be 0.0025, but was {feeRate}","messagePattern":"Fee rate should be 0\\.0025, but was (.+?)","errorType":"exception","errorClass":"RegressionTestException","httpStatus":null,"severity":"error","filePath":"Algorithm.CSharp/CustomShortableProviderRegressionAlgorithm.cs","lineNumber":68,"sourceCode":"            }\n        }\n\n        public override void OnEndOfAlgorithm()\n        {\n            var transactions = Transactions.OrdersCount;\n            if (transactions != 1)\n            {\n                throw new RegressionTestException($\"Algorithm should have just 1 order, but was {transactions}\");\n            }\n            var orderQuantity = Transactions.GetOrderById(_orderId).Quantity;\n            if (orderQuantity != -1001)\n            {\n                throw new RegressionTestException($\"Quantity of order {_orderId} should be -1001, but was {orderQuantity}\");\n            }\n            var feeRate = _spy.ShortableProvider.FeeRate(_spy.Symbol, Time);\n            if (feeRate != 0.0025m)\n            {\n                throw new RegressionTestException($\"Fee rate should be 0.0025, but was {feeRate}\");\n            }\n            var rebateRate = _spy.ShortableProvider.RebateRate(_spy.Symbol, Time);\n            if (rebateRate != 0.0507m)\n            {\n                throw new RegressionTestException($\"Fee rate should be 0.0507, but was {rebateRate}\");\n            }\n        }\n\n        private class CustomSPYShortableProvider : IShortableProvider\n        {\n            public decimal FeeRate(Symbol symbol, DateTime localTime) => 0.0025m;\n\n            public decimal RebateRate(Symbol symbol, DateTime localTime) => 0.0507m;\n\n            public long? ShortableQuantity(Symbol symbol, DateTime localTime)\n            {\n                if (localTime < new DateTime(2013, 10, 4, 16, 0, 0))\n                {","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/QuantConnect/Lean/blob/d2c3659f877bfc2b5d9dc0fc89a9c7566f45e892/Algorithm.CSharp/CustomShortableProviderRegressionAlgorithm.cs#L50-L86","documentation":"Asserts _spy.ShortableProvider.FeeRate returns exactly 0.0025m at end-of-algorithm Time. The custom CustomSPYShortableProvider returns a constant 0.0025m; a different value means the custom provider is not the one installed (the default provider answered instead).","triggerScenarios":"Calling FeeRate on _spy.ShortableProvider and getting a non-0.0025 value, indicating SetShortableProvider did not persist or was overwritten.","commonSituations":"SetShortableProvider called before SetBrokerageModel so the brokerage overwrote it; provider set on a different Security reference; or the brokerage model's default shortable provider took precedence.","solutions":["Call _spy.SetShortableProvider(new CustomSPYShortableProvider()) AFTER SetBrokerageModel.","Ensure _spy is the stored Security from AddEquity, not a recomputed reference.","Verify CustomSPYShortableProvider.FeeRate returns 0.0025m (constant) and is not shadowed by an interface default.","Re-assert the provider type at OnEndOfAlgorithm to detect silent overwrites."],"exampleFix":"// before: brokerage overwrites the shortable provider\n_spy.SetShortableProvider(new CustomSPYShortableProvider());\nSetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);\n\n// after: install custom provider after brokerage defaults\nSetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);\n_spy.SetShortableProvider(new CustomSPYShortableProvider());","handlingStrategy":"validation","validationCode":"// Assert the custom provider is installed before reading rates\nif (!(_spy.ShortableProvider is CustomSPYShortableProvider))\n    throw new InvalidOperationException(\"Custom shortable provider not installed\");\nvar fee = _spy.ShortableProvider.FeeRate(_spy.Symbol, Time);","typeGuard":"bool HasCustomShortableProvider(Security s) => s.ShortableProvider is CustomSPYShortableProvider;","tryCatchPattern":null,"preventionTips":["Call SetShortableProvider after SetBrokerageModel.","Configure the stored Security reference, not a throwaway.","Re-assert the provider type before reading its rates."],"tags":["regression-test","shortable-provider","fee-rate","brokerage-model"],"backgroundTag":null,"analyzedSha":"d2c3659f877bfc2b5d9dc0fc89a9c7566f45e892","analyzedAt":"2026-08-13T13:52:21.013Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}