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.
- Log in to Webull.com and open the account center.
- From the avatar menu, open and then click .
- Submit your API application and wait for approval, which takes one to two business days. You receive a confirmation email when it's approved.
- After approval, click , enter an application name, accept the Webull OpenAPI Agreement, and register the application.
- Click 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 .
- 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:
- In the
Initializeinitializemethod of your algorithm, set the Webull brokerage model and your account type. - 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 Type | Equity | Equity Options | Index Options |
|---|---|---|---|
| Market | ![]() | ![]() | ![]() |
| Limit | ![]() | ![]() | ![]() |
| Stop market | ![]() | ![]() | ![]() |
| Stop limit | ![]() | ![]() | ![]() |
| Trailing stop | ![]() |
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.
| Property | Data Type | Description | Default Value |
|---|---|---|---|
TimeInForcetime_in_force | TimeInForce | A TimeInForce instruction to apply to the order. The following instructions are supported:
DayDAY, which the brokerage sets automatically. Option and Index Option sell orders also support only DayDAY.
| TimeInForce.GoodTilCanceledTimeInForce.GOOD_TIL_CANCELED |
OutsideRegularTradingHoursoutside_regular_trading_hours | bool | If 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.
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.
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:
- Open the project you want to deploy.
- Click the
Deploy Live icon. - On the Deploy Live page, click the Brokerage field and then click from the drop-down menu.
- Enter your Webull App Key, App Secret, and account ID.
- Click the Node field and then click the live trading node that you want to use from the drop-down menu.
- (Optional) In the Data Provider section, click and change the data provider or add additional providers.
- (Optional) Set up notifications.
- Configure the Automatically restart algorithm setting.
- Click .
To generate your API credentials, see Account Types. Your account details are not saved on QuantConnect.
Webull doesn't provide a live data feed, so use the QuantConnect data provider or another data provider for the securities you trade.
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.
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 |
|---|---|
| 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. | |
| 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.
