{"record":{"id":"0fba9f62afd1e526","repo":"QuantConnect/Lean","slug":"fee-rate-should-be-0-0507-but-was-rebaterate","errorCode":null,"errorMessage":"Fee rate should be 0.0507, but was {rebateRate}","messagePattern":"Fee rate should be 0\\.0507, but was (.+?)","errorType":"exception","errorClass":"RegressionTestException","httpStatus":null,"severity":"error","filePath":"Algorithm.CSharp/CustomShortableProviderRegressionAlgorithm.cs","lineNumber":73,"sourceCode":"            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                {\n                    return 10;\n                }\n                else\n                {\n                    return 1001;","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/QuantConnect/Lean/blob/d2c3659f877bfc2b5d9dc0fc89a9c7566f45e892/Algorithm.CSharp/CustomShortableProviderRegressionAlgorithm.cs#L55-L91","documentation":"Asserts RebateRate returns exactly 0.0507m (note: the message text mislabels it 'Fee rate' but the variable is rebateRate). CustomSPYShortableProvider.RebateRate is constant 0.0507m; any other value means the custom provider is not installed at query time.","triggerScenarios":"Reading _spy.ShortableProvider.RebateRate at OnEndOfAlgorithm and getting the default provider's value (e.g., 0 or a different constant) because SetShortableProvider did not stick.","commonSituations":"Same as FeeRate: brokerage model reset the provider, or provider set on the wrong reference. Distinct from error 55 only in which property is queried.","solutions":["Apply SetShortableProvider after SetBrokerageModel on the stored _spy Security.","Confirm CustomSPYShortableProvider implements RebateRate returning 0.0507m.","Detect provider swaps by asserting `_spy.ShortableProvider is CustomSPYShortableProvider` before reading rates.","Keep one place that assigns the provider to avoid double-assignment races."],"exampleFix":"// before: provider overwritten, rebate reads default\n_spy.SetShortableProvider(new CustomSPYShortableProvider());\nSetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);\n\n// after: custom provider wins\nSetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);\n_spy.SetShortableProvider(new CustomSPYShortableProvider());","handlingStrategy":"validation","validationCode":"if (!(_spy.ShortableProvider is CustomSPYShortableProvider))\n    throw new InvalidOperationException(\"Custom shortable provider not installed\");\nvar rebate = _spy.ShortableProvider.RebateRate(_spy.Symbol, Time);","typeGuard":"bool HasCustomShortableProvider(Security s) => s.ShortableProvider is CustomSPYShortableProvider;","tryCatchPattern":null,"preventionTips":["Install the custom provider after the brokerage model.","Confirm RebateRate returns 0.0507m in the implementation.","Assert provider identity before reading either rate."],"tags":["regression-test","shortable-provider","rebate-rate","brokerage-model"],"backgroundTag":null,"analyzedSha":"d2c3659f877bfc2b5d9dc0fc89a9c7566f45e892","analyzedAt":"2026-08-13T13:52:21.013Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}