I am creating my own custom brokerage in the Lean engine (for dYdX), but I'm encountering some issues with currency conversions. How can I define my own conversion rules? If you check the logs, you'll see the problem.

  1. 20250423 12:39:30.567 TRACE:: Config.GetValue(): debug-mode - Using default value: False
  2. 20250423 12:39:30.574 TRACE:: Config.Get(): Configuration key not found. Key: version-id - Using default value:
  3. 20250423 12:39:30.574 TRACE:: Config.Get(): Configuration key not found. Key: cache-location - Using default value:
  4. 20250423 12:39:30.576 TRACE:: Config.GetValue(): project-id - Using default value: 0
  5. 20250423 12:39:30.576 TRACE:: Config.Get(): Configuration key not found. Key: api-url - Using default value: https://www.quantconnect.com/api/v2/
  6. 20250423 12:39:30.576 TRACE:: Config.Get(): Configuration key not found. Key: results-destination-folder - Using default value: D:\MyProjects\doxia-investing\DoxiaInvesting-QuantConnect-dYdx\Lean\Launcher\bin\Debug
  7. 20250423 12:39:30.577 TRACE:: Config.Get(): Configuration key not found. Key: plugin-directory - Using default value:
  8. 20250423 12:39:30.596 TRACE:: Config.Get(): Configuration key not found. Key: composer-dll-directory - Using default value:
  9. 20250423 12:39:30.598 TRACE:: Composer(): Loading Assemblies from D:\MyProjects\doxia-investing\DoxiaInvesting-QuantConnect-dYdx\Lean\Launcher\bin\Debug\
  10. 20250423 12:39:31.479 TRACE:: Python for .NET Assembly: Python.Runtime, Version=2.0.42.0, Culture=neutral, PublicKeyToken=5000fea6cba702dd
  11. 20250423 12:39:31.592 TRACE:: Engine.Main(): LEAN ALGORITHMIC TRADING ENGINE v2.5.0.0 Mode: DEBUG (64bit) Host: DESKTOP-057CRGC
  12. 20250423 12:39:31.607 TRACE:: Engine.Main(): Started 17:39
  13. 20250423 12:39:31.698 TRACE:: Config.Get(): Configuration key not found. Key: lean-manager-type - Using default value: LocalLeanManager
  14. 20250423 12:39:31.746 TRACE:: JobQueue.NextJob(): Selected QuantConnect.Algorithm.CSharp.dll
  15. 20250423 12:39:32.121 TRACE:: Config.GetValue(): scheduled-event-leaky-bucket-capacity - Using default value: 120
  16. 20250423 12:39:32.156 TRACE:: Config.GetValue(): scheduled-event-leaky-bucket-time-interval-minutes - Using default value: 1440
  17. 20250423 12:39:32.157 TRACE:: Config.GetValue(): scheduled-event-leaky-bucket-refill-amount - Using default value: 18
  18. 20250423 12:39:32.164 TRACE:: Config.GetValue(): storage-limit - Using default value: 10737418240
  19. 20250423 12:39:32.165 TRACE:: Config.GetValue(): storage-file-count - Using default value: 10000
  20. 20250423 12:39:32.165 TRACE:: Config.GetValue(): storage-permissions - Using default value: 3
  21. 20250423 12:39:32.165 TRACE:: Config.Get(): Configuration key not found. Key: algorithm-id - Using default value: MyTestTradingAlgorithm
  22. 20250423 12:39:32.181 TRACE:: Config.Get(): Configuration key not found. Key: history-provider - Using default value: SubscriptionDataReaderHistoryProvider
  23. 20250423 12:39:32.181 TRACE:: Config.Get(): Configuration key not found. Key: data-channel - Using default value:
  24. 20250423 12:39:32.182 TRACE:: Config.Get(): Configuration key not found. Key: python-venv - Using default value:
  25. 20250423 12:39:35.859 TRACE:: Config.Get(): Configuration key not found. Key: data-permission-manager - Using default value: DataPermissionManager
  26. 20250423 12:39:35.866 TRACE:: Config.GetValue(): streamed-chart-limit - Using default value: 12
  27. 20250423 12:39:35.867 TRACE:: Config.GetValue(): streamed-chart-group-size - Using default value: 3
  28. 20250423 12:39:35.876 TRACE:: Config.GetValue(): downloader-data-update-period - Using default value: 7
  29. 20250423 12:39:36.496 TRACE:: Config.GetValue(): zip-data-cache-provider - Using default value: 10
  30. 20250423 12:39:36.501 TRACE:: Config.Get(): Configuration key not found. Key: fundamental-data-provider - Using default value: CoarseFundamentalDataProvider
  31. 20250423 12:39:36.505 TRACE:: AlgorithmManager.CreateTokenBucket(): Initializing LeakyBucket: Capacity: 120 RefillAmount: 18 TimeInterval: 1440
  32. 20250423 12:39:36.506 TRACE:: Config.GetValue(): algorithm-manager-time-loop-maximum - Using default value: 20
  33. 20250423 12:39:36.526 TRACE:: Engine.Run(): Resource limits '0' CPUs. 2147483647 MB RAM.
  34. 20250423 12:39:36.526 TRACE:: TextSubscriptionDataSourceReader.SetCacheSize(): Setting cache size to 71582788 items
  35. 20250423 12:39:36.532 TRACE:: Config.GetValue(): algorithm-creation-timeout - Using default value: 90
  36. 20250423 12:39:36.535 TRACE:: Loader.TryCreateILAlgorithm(): Loading only the algorithm assembly
  37. 20250423 12:39:36.562 TRACE:: Config.Get(): Configuration key not found. Key: databases-refresh-period - Using default value: 1.00:00:00
  38. 20250423 12:39:36.789 TRACE:: Loader.TryCreateILAlgorithm(): Loaded MyTestTradingAlgorithm
  39. 20250423 12:39:36.790 TRACE:: Config.Get(): Configuration key not found. Key: object-store-root - Using default value: ./storage
  40. 20250423 12:39:36.794 TRACE:: LocalObjectStore.Initialize(): Storage Root: D:\MyProjects\doxia-investing\DoxiaInvesting-QuantConnect-dYdx\Lean\Launcher\bin\Debug\storage. StorageFileCount 10000. StorageLimit 10240MB
  41. 20250423 12:39:36.795 TRACE:: LiveTradingDataFeed.GetDataChannelProvider(): will use DataChannelProvider
  42. 20250423 12:39:36.796 TRACE:: BrokerageSetupHandler.CreateBrokerage(): creating brokerage 'DydxBrokerage'
  43. 20250423 12:39:36.812 TRACE:: DydxBrokerage.Initialize(): found no data aggregator instance, creating QuantConnect.Lean.Engine.DataFeeds.AggregationManager
  44. 20250423 12:39:39.147 TRACE:: BrokerageMultiWebSocketSubscriptionManager(): WebSocket connections will be restarted every: 23:45:00
  45. 20250423 12:39:39.162 TRACE:: CompositeDataQueueHandler.SetJob(): will use [
  46. "DydxBrokerage"
  47. ]
  48. 20250423 12:39:39.168 TRACE:: BaseDataExchange(CustomDataExchange) Starting...
  49. 20250423 12:39:39.168 TRACE:: Config.GetValue(): zip-data-cache-provider - Using default value: 10
  50. 20250423 12:39:39.196 TRACE:: HistoryProviderManager.Initialize(): history providers [SubscriptionDataReaderHistoryProvider]
  51. 20250423 12:39:39.199 TRACE:: BaseSetupHandler.Setup(LocalPlatform): UID: 346944, PID: 0, Version: 2.5.0.0, Source: WebIDE
  52. 20250423 12:39:39.201 TRACE:: LiveTradingResultHandler.SendStatusUpdate(): status: 'LoggingIn'. Logging into brokerage...
  53. 20250423 12:39:39.201 TRACE:: BrokerageSetupHandler.Setup(): Connecting to brokerage...
  54. 20250423 12:39:39.202 TRACE:: BrokerageSetupHandler.Setup(): dydx account base currency: USD
  55. 20250423 12:39:39.203 TRACE:: BrokerageSetupHandler.Setup(): Initializing algorithm...
  56. 20250423 12:39:39.203 TRACE:: LiveTradingResultHandler.SendStatusUpdate(): status: 'Initializing'. Initializing algorithm...
  57. 20250423 12:39:39.208 TRACE:: Config.Get(): Configuration key not found. Key: security-data-feeds - Using default value:
  58. 20250423 12:39:39.216 TRACE:: SecurityPortfolioManager.SetAccountCurrency(): setting account currency to USD
  59. 20250423 12:39:39.260 TRACE:: BrokerageSetupHandler.Setup(): Fetching cash balance from brokerage...
  60. 20250423 12:39:39.262 TRACE:: BrokerageSetupHandler.Setup(): Fetching open orders from brokerage...
  61. 20250423 12:39:39.263 TRACE:: BrokerageSetupHandler.Setup(): Fetching holdings from brokerage...
  62. 20250423 12:39:39.264 TRACE:: AggregationManager.Initialize(): daily strict end times: True
  63. 20250423 12:39:39.279 TRACE:: LiveTradingDataFeed.CreateUniverseSubscription(): Creating user defined universe: QC-UNIVERSE-USERDEFINED-BINANCE-CRYPTOFUTURE 18R
  64. 20250423 12:39:39.284 TRACE:: DataManager.AddSubscription(): Added QC-UNIVERSE-USERDEFINED-BINANCE-CRYPTOFUTURE,#0,QC-UNIVERSE-USERDEFINED-BINANCE-CRYPTOFUTURE,Tick,Tick,Trade,Adjusted,OpenInterest,Internal. Start: 23.04.2025 12:39:39. End: 31.12.2050 00:00:00
  65. 20250423 12:39:39.297 ERROR:: No tradeable pair was found for currency BTC, conversion rate to account currency (USD) will be set to zero. Markets: [Forex:oanda,Cfd:oanda,Crypto:coinbase]
  66. 20250423 12:39:39.317 TRACE:: Failed to assign conversion rates for the following cash: BTC. Attempting to request daily resolution history to resolve conversion rate
  67. 20250423 12:39:39.322 TRACE:: BaseSetupHandler.SetupCurrencyConversions():
  68. Account Type: Margin
  69. Symbol Quantity Conversion = Value in USD
  70. USD: $ 0.00 @ 1.00 = $0
  71. BTC: â‚¿ 0.00 @ 0.00 = $0
  72. -------------------------------------------------
  73. CashBook Total Value: $0
  74. 20250423 12:39:39.325 TRACE:: Total margin information: TotalMarginUsed: 0.00, MarginRemaining: 0.00
  75. 20250423 12:39:39.329 TRACE:: JOB HANDLERS:
  76. DataFeed: QuantConnect.Lean.Engine.DataFeeds.LiveTradingDataFeed
  77. Setup: QuantConnect.Lean.Engine.Setup.BrokerageSetupHandler
  78. RealTime: QuantConnect.Lean.Engine.RealTime.LiveTradingRealTimeHandler
  79. Results: QuantConnect.Lean.Engine.Results.LiveTradingResultHandler
  80. Transactions: QuantConnect.Lean.Engine.TransactionHandlers.DydxBrokerageTransactionHandler
  81. Object Store: QuantConnect.Lean.Engine.Storage.LocalObjectStore
  82. History Provider: QuantConnect.Lean.Engine.HistoricalData.HistoryProviderManager
  83. Brokerage: QuantConnect.Brokerages.DydxBrokerage
  84. Data Provider: QuantConnect.Lean.Engine.DataFeeds.DefaultDataProvider
  85. 20250423 12:39:39.347 TRACE:: Event Name "Daily Sampling", scheduled to run.
  86. 20250423 12:39:39.347 TRACE:: AlgorithmManager.Run(): Begin DataStream - Start: 23.04.2025 00:00:00 Stop: 31.12.2050 00:00:00 Time: 23.04.2025 08:39:39 Warmup: False
+ Expand
  1. public class MyTestTradingAlgorithm : QCAlgorithm
  2. {
  3. private Symbol _symbol;
  4. private decimal _lastTradePrice;
  5. public override void Initialize()
  6. {
  7. SetAccountCurrency("USD");
  8. const string market = "dydx";
  9. Transactions.MarketOrderFillTimeout = TimeSpan.FromMinutes(15);
  10. SetBrokerageModel(new DydxBrokerageModel());
  11. var marketHoursDatabase = QuantConnect.Securities.MarketHoursDatabase.FromDataFolder();
  12. var alwaysOpen = QuantConnect.Securities.SecurityExchangeHours.AlwaysOpen(DateTimeZone.Utc);
  13. marketHoursDatabase.SetEntry(market, "[*]", SecurityType.CryptoFuture, alwaysOpen);
  14. _symbol = AddCryptoFuture("BTCUSD", Resolution.Tick).Symbol;
  15. SetBenchmark(_symbol);
  16. }
  17. public override void OnData(Slice data)
  18. {
  19. // .................
  20. }
  21. }
+ Expand

 

  1. {
  2. "environment": "live-dydx", // "live-dydx", "backtesting"
  3. //"algorithm-type-name": "DydxBacktestAlgorithm", // Algorithm for backtesting using historical data.
  4. "algorithm-type-name": "MyTestTradingAlgorithm", // Algorithm for Testing Integration with dYdX
  5. // Algorithm language selector - options CSharp, Python
  6. "algorithm-language": "CSharp",
  7. "algorithm-location": "QuantConnect.Algorithm.CSharp.dll",
  8. //"algorithm-location": "../../../Algorithm.Python/BasicTemplateFrameworkAlgorithm.py",
  9. //Research notebook
  10. //"composer-dll-directory": ".",
  11. // engine
  12. "data-folder": "../../../Data/",
  13. // debugging configuration - options for debugging-method LocalCmdLine, VisualStudio, Debugpy, PyCharm
  14. "debugging": false,
  15. "debugging-method": "LocalCmdline",
  16. // location of a python virtual env to use libraries from
  17. //"python-venv": "/venv",
  18. // handlers
  19. "log-handler": "QuantConnect.Logging.CompositeLogHandler",
  20. "messaging-handler": "QuantConnect.Messaging.Messaging",
  21. "job-queue-handler": "QuantConnect.Queues.JobQueue",
  22. "api-handler": "QuantConnect.Api.Api",
  23. "map-file-provider": "QuantConnect.Data.Auxiliary.LocalDiskMapFileProvider",
  24. "factor-file-provider": "QuantConnect.Data.Auxiliary.LocalDiskFactorFileProvider",
  25. "data-provider": "QuantConnect.Lean.Engine.DataFeeds.DefaultDataProvider",
  26. "data-channel-provider": "DataChannelProvider",
  27. "object-store": "QuantConnect.Lean.Engine.Storage.LocalObjectStore",
  28. "data-aggregator": "QuantConnect.Lean.Engine.DataFeeds.AggregationManager",
  29. // limits on number of symbols to allow
  30. "symbol-minute-limit": 10000,
  31. "symbol-second-limit": 10000,
  32. "symbol-tick-limit": 10000,
  33. // log missing data files, useful for debugging
  34. "show-missing-data-logs": false,
  35. // For live trading during warmup we limit the amount of historical data fetched from the history provider and expect the data to be on disk for older data
  36. "maximum-warmup-history-days-look-back": 5,
  37. // limits the amount of data points per chart series. Applies only for backtesting
  38. "maximum-data-points-per-chart-series": 1000000,
  39. "maximum-chart-series": 30,
  40. // if one uses true in following token, market hours will remain open all hours and all days.
  41. // if one uses false will make lean operate only during regular market hours.
  42. "force-exchange-always-open": false,
  43. // save list of transactions to the specified csv file
  44. "transaction-log": "",
  45. // Prefix for Windows reserved filenames
  46. "reserved-words-prefix": "@",
  47. // To get your api access token go to quantconnect.com/account
  48. "job-user-id": "346944",
  49. "api-access-token": "c52abbbde7140ffc1bd86293a24b25d524278f7c18f743f7b0b7f3f93267fc35",
  50. "job-organization-id": "",
  51. // live data configuration
  52. "live-data-url": "ws://www.quantconnect.com/api/v2/live/data/",
  53. "live-data-port": 8020,
  54. // live portfolio state
  55. "live-cash-balance": "",
  56. "live-holdings": "[]",
  57. // parameters to set in the algorithm (the below are just samples)
  58. "parameters": {
  59. // Intrinio account user and password
  60. "intrinio-username": "",
  61. "intrinio-password": "",
  62. "ema-fast": 10,
  63. "ema-slow": 20
  64. },
  65. // specify supported languages when running regression tests
  66. "regression-test-languages": [ "CSharp", "Python" ],
  67. // Additional paths to include in python for import resolution
  68. "python-additional-paths": [],
  69. "environments": {
  70. // defines the 'backtesting' environment
  71. "backtesting": {
  72. "live-mode": false,
  73. "setup-handler": "QuantConnect.Lean.Engine.Setup.BacktestingSetupHandler",
  74. "result-handler": "QuantConnect.Lean.Engine.Results.BacktestingResultHandler",
  75. "data-feed-handler": "QuantConnect.Lean.Engine.DataFeeds.FileSystemDataFeed",
  76. "real-time-handler": "QuantConnect.Lean.Engine.RealTime.BacktestingRealTimeHandler",
  77. "history-provider": [ "QuantConnect.Lean.Engine.HistoricalData.SubscriptionDataReaderHistoryProvider" ],
  78. "transaction-handler": "QuantConnect.Lean.Engine.TransactionHandlers.BacktestingTransactionHandler"
  79. },
  80. "live-dydx": {
  81. "live-mode": true,
  82. "live-mode-brokerage": "DydxBrokerage",
  83. "setup-handler": "QuantConnect.Lean.Engine.Setup.BrokerageSetupHandler",
  84. "result-handler": "QuantConnect.Lean.Engine.Results.LiveTradingResultHandler",
  85. "data-feed-handler": "QuantConnect.Lean.Engine.DataFeeds.LiveTradingDataFeed",
  86. //"data-queue-handler": [ "DydxBrokerageDataQueue" ],
  87. "data-queue-handler": [ "DydxBrokerage" ],
  88. "real-time-handler": "QuantConnect.Lean.Engine.RealTime.LiveTradingRealTimeHandler",
  89. //"transaction-handler": "QuantConnect.Lean.Engine.TransactionHandlers.BacktestingTransactionHandler",
  90. "transaction-handler": "QuantConnect.Lean.Engine.TransactionHandlers.DydxBrokerageTransactionHandler"
  91. }
  92. }
  93. }
+ Expand

 

 

 

 

 

 

 

 

 

 

 

 

 

Author

Oilan Online

4 days ago