/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace QuantConnect.Securities.CryptoFuture { /// /// Binance-specific crypto future margin model that includes supplementary stable coin /// currencies as alternative collateral for non-coin (USDⓈ-M) futures. /// /// /// EU/EEA users under MiCA Credits Trading Mode have BNFCR in their account. /// When BNFCR is present, this model aggregates all supplementary collateral assets /// using their walletBalance values converted to the primary collateral currency. /// Non-EU accounts don't have BNFCR — the check is a no-op for them. /// See: https://www.binance.com/en/support/faq/detail/0e857c392a2d47cebde0af762d9255ae /// public class BinanceCryptoFutureMarginModel : CryptoFutureMarginModel { /// /// Binance Futures Credits currency symbol, present in EU/EEA accounts under MiCA Credits Trading Mode. /// private const string BNFCRCurrency = "BNFCR"; /// /// Creates a new instance /// /// The leverage to use, default 25x public BinanceCryptoFutureMarginModel(decimal leverage = 25) : base(leverage) { } /// /// Gets the total collateral amount for a Binance crypto future, including supplementary /// collateral assets for EU/EEA accounts in MiCA Credits Trading Mode. /// For coin futures (e.g. BTCUSD), only the primary collateral (base currency) is used. /// /// The algorithm's portfolio /// The crypto future security /// The primary collateral cash (e.g. USDT) /// Total collateral amount in terms of the primary collateral currency protected override decimal GetTotalCollateralAmount( SecurityPortfolioManager portfolio, Security security, Cash primaryCollateral) { // BNFCR presence means EU/EEA account in MiCA Credits Trading Mode. // Non-EU accounts don't have BNFCR in CashBook — skip entirely. var cashBook = portfolio.CashBook; if (!cashBook.ContainsKey(BNFCRCurrency)) { return base.GetTotalCollateralAmount(portfolio, security, primaryCollateral); } // Aggregate all collateral assets using walletBalance values. // Binance controls which assets are in the account — we sum everything // with a non-zero balance, converting to the primary collateral currency. // Negative amounts (e.g. BNFCR fees) correctly reduce the total. var total = 0m; foreach (var kvp in cashBook) { var cash = kvp.Value; if (cash.Amount == 0) { continue; } total += cashBook.Convert(cash.Amount, cash.Symbol, primaryCollateral.Symbol); } return total; } /// /// When BNFCR is present (EU/MiCA mode), all USDⓈ-M futures share the same collateral /// pool regardless of quote currency (USDT, USDC, etc.). /// protected override bool SharesCollateral(SecurityPortfolioManager portfolio, Cash collateralCurrency, Security otherCryptoFuture) { return portfolio.CashBook.ContainsKey(BNFCRCurrency) || base.SharesCollateral(portfolio, collateralCurrency, otherCryptoFuture); } } }