Brokerages

Webull

Introduction

QuantConnect enables you to run your algorithms in live mode with real-time market data.

Webull is a commission-free trading platform founded in 2017 and operated in the United States by Webull Financial LLC. Webull provides access to trading Equities, Equity Options, and Index Options through its Open API, with no commissions on US-listed stocks and options.

Account Types

Webull supports cash and margin accounts. To set the account type in an algorithm, see the Webull brokerage model documentation.

Create an Account

Follow the account creation wizard on the Webull website to create a Webull account.

Create API Credentials

To trade with the Webull API, you need an App Key, App Secret, and the account ID of the Webull account you want to trade. The following steps summarize how to create them. For the full process with screenshots, see Individual Application API in the Webull developer documentation.

  1. Log in to Webull.com and open the account center.
  2. From the avatar menu, open Developer Tools and then click API Management > My Application.
  3. Submit your API application and wait for approval, which takes one to two business days. You receive a confirmation email when it's approved.
  4. After approval, click API Management > Application Management, enter an application name, accept the Webull OpenAPI Agreement, and register the application.
  5. Click Generate Key and then complete the SMS verification code and transaction password verification to generate your App Key and App Secret. You can reset the App Secret later with Reset Key.
  6. Note the account ID of the Webull account you want to trade.

Paper Trading

The Webull API doesn't support paper trading, but you can follow these steps to simulate it with QuantConnect:

  1. In the Initializeinitialize method of your algorithm, set the Webull brokerage model and your account type.
  2. Deploy your algorithm with the QuantConnect Paper Trading brokerage.

Asset Classes

Our Webull integration supports the following asset classes:

You may not be able to trade all assets with Webull. For example, if you live in the EU, you can't trade US ETFs. Check with your local regulators to know which assets you are allowed to trade. You may need to adjust settings in your brokerage account to live trade some assets.

Data Providers

Webull doesn't provide a live data feed. The QuantConnect data provider supplies US Equity, Equity Option, Index, and Index Option data during live trading. For more information about live data providers, see Datasets.

Orders

We model the Webull API by supporting several order types, the TimeInForce order property, and order updates. When you deploy live algorithms, you can place manual orders through the IDE.

Order Types

The following table describes the available order types for each asset class that our Webull integration supports:

Order TypeEquityEquity OptionsIndex Options
Marketgreen checkgreen checkgreen check
Limitgreen checkgreen checkgreen check
Stop marketgreen checkgreen checkgreen check
Stop limitgreen checkgreen checkgreen check
Trailing stopgreen check

Order Properties

We model custom order properties from the Webull API. The following table describes the members of the WebullOrderProperties object that you can set to customize order execution.

PropertyData TypeDescriptionDefault Value
TimeInForcetime_in_forceTimeInForceA TimeInForce instruction to apply to the order. The following instructions are supported:
  • DayDAY
  • GoodTilCanceledGOOD_TIL_CANCELED
Market orders support only DayDAY, which the brokerage sets automatically. Option and Index Option sell orders also support only DayDAY.
TimeInForce.GoodTilCanceledTimeInForce.GOOD_TIL_CANCELED
OutsideRegularTradingHoursoutside_regular_trading_hoursboolIf set to true, allows orders to also trigger or fill outside of regular trading hours. This property applies to Equity orders only and isn't supported for market orders.falseFalse

Updates

We model the Webull API by supporting order updates.

Handling Splits

If you're using raw data normalization and you have active orders with a limit, stop, or trigger price in the market for a US Equity when a stock split occurs, the following properties of your orders automatically adjust to reflect the stock split:

  • Quantity
  • Limit price
  • Stop price
  • Trigger price

Rate Limit

Webull enforces the following rate limits on its trading API:

  • Order requests (place, replace, and cancel): 600 requests per 60 seconds.
  • Account and order queries (balance, positions, open orders, and order history): 2 requests per 2 seconds.

To avoid hitting these limits, design your algorithm to issue orders sparingly.

Fees

Webull trading for Equity and Equity Options is commission-free. Index Options incur per-contract exchange fees. To view the Webull trading fees, see the Pricing page on the Webull website. To view how we model their fees, see Fees.

Margin

We model buying power and margin calls to ensure your algorithm stays within the margin requirements. If you have more than $25,000 in your brokerage account, you can use the PatternDayTradingMarginModel to make use of the 4x intraday leverage and 2x overnight leverage available on most brokerages from the PDT rule.

Slippage

Orders through Webull do not experience slippage in backtests and QuantConnect Paper Trading. In live trading, your orders may experience slippage.

To view how we model Webull slippage, see Slippage.

Fills

QuantConnect fills market orders immediately and completely in backtests and QuantConnect Paper Trading. In live trading, if the quantity of your market orders exceeds the quantity available at the top of the order book, your orders are filled according to what is available in the order book.

To view how we model Webull order fills, see Fills.

Settlements

If you trade with a margin account, trades settle immediately

To view how we model settlement for Webull trades, see Settlement.

Security and Stability

When you deploy live algorithms with Webull, we don't save your credentials.

Deposits and Withdrawals

You can deposit and withdraw cash from your brokerage account while you run an algorithm that's connected to the account. We sync the algorithm's cash holdings with the cash holdings in your brokerage account every day at 7:45 AM Eastern Time (ET).

Funds are available for API trading 24 hours after the deposit.

Demo Algorithm

The following algorithm demonstrates the functionality of the Webull brokerage:

// Demonstrate Webull brokerage functionality with an EMA crossover strategy on SPY.
public class WebullDemoAlgorithm : QCAlgorithm
{
    private ExponentialMovingAverage _fast;
    private ExponentialMovingAverage _slow;

    public override void Initialize()
    {
        SetStartDate(2024, 9, 1);
        SetEndDate(2024, 12, 31);
        SetCash(100000);
        SetBrokerageModel(BrokerageName.Webull, AccountType.Margin);
        var symbol = AddEquity("SPY", Resolution.Daily).Symbol;
        _fast = EMA(symbol, 10, Resolution.Daily);
        _slow = EMA(symbol, 50, Resolution.Daily);
    }

    public override void OnData(Slice slice)
    {
        if (!_slow.IsReady) return;
        if (_fast > _slow && !Portfolio.Invested)
            SetHoldings("SPY", 1);
        else if (_fast < _slow && Portfolio.Invested)
            Liquidate();
    }
}
# Demonstrate Webull brokerage functionality with an EMA crossover strategy on SPY.
class WebullDemoAlgorithm(QCAlgorithm):
    def initialize(self) -> None:
        self.set_start_date(2024, 9, 1)
        self.set_end_date(2024, 12, 31)
        self.set_cash(100000)
        self.set_brokerage_model(BrokerageName.WEBULL, AccountType.MARGIN)
        symbol = self.add_equity("SPY", Resolution.DAILY).symbol
        self._fast = self.ema(symbol, 10, Resolution.DAILY)
        self._slow = self.ema(symbol, 50, Resolution.DAILY)

    def on_data(self, slice: Slice) -> None:
        if not self._slow.is_ready:
            return
        if self._fast.current.value > self._slow.current.value and not self.portfolio.invested:
            self.set_holdings("SPY", 1)
        elif self._fast.current.value < self._slow.current.value and self.portfolio.invested:
            self.liquidate()

Deploy Live Algorithms

You must have an available live trading node for each live trading algorithm you deploy.

Follow these steps to deploy a live algorithm:

  1. Open the project you want to deploy.
  2. Click the Lightning icon Deploy Live icon.
  3. On the Deploy Live page, click the Brokerage field and then click Webull from the drop-down menu.
  4. Enter your Webull App Key, App Secret, and account ID.
  5. To generate your API credentials, see Account Types. Your account details are not saved on QuantConnect.

  6. Click the Node field and then click the live trading node that you want to use from the drop-down menu.
  7. (Optional) In the Data Provider section, click Show and change the data provider or add additional providers.
  8. Webull doesn't provide a live data feed, so use the QuantConnect data provider or another data provider for the securities you trade.

  9. (Optional) Set up notifications.
  10. Configure the Automatically restart algorithm setting.
  11. By enabling automatic restarts, the algorithm will use best efforts to restart the algorithm if it fails due to a runtime error. This can help improve the algorithm's resilience to temporary outages such as a brokerage API disconnection.

  12. Click Deploy.

The deployment process can take up to 5 minutes. When the algorithm deploys, the live results page displays. If you know your brokerage positions before you deployed, you can verify they have been loaded properly by checking your equity value in the runtime statistics, your cashbook holdings, and your position holdings.

Troubleshooting

The following table describes errors you may see when deploying to Webull:

Error Message(s)Possible Cause and Fix
Invalid signature
Authentication failed
Your App Key or App Secret may be incorrect or no longer active. Log in to the Webull Developer Portal, verify your credentials are enabled for trading, and regenerate them if necessary.
Account not found
The account ID you provided isn't associated with your API credentials. Check the account ID in the Webull Developer Portal and confirm it matches the account you want to trade.

If you need further support, open a new support ticket and add the live deployment with the error.

You can also see our Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the documentation: