book
Checkout our new book! Hands on AI Trading with Python, QuantConnect, and AWS Learn More arrow

Forex

Requesting Data

Introduction

Request Forex data in your algorithm to receive a feed of exchange rates in the on_data method. For more information about the specific dataset we use for backtests, see the FOREX dataset listing. To trade Forex live, you can use the QuantConnect data provider.

Create Subscriptions

To create a Forex pair subscription, in the initialize method, call the add_forex method. The add_forex method returns a Forex object, which contains a symbol property. Save a reference to the symbol so you can use it in on_data to access the security data in the Slice.

Select Language:
self._symbol = self.add_forex("EURUSD").symbol

To view the supported Forex pairs, see Supported Assets.

Resolutions

The following table shows the available resolutions and data formats for Forex subscriptions:

ResolutionTradeBarQuoteBarTrade TickQuote Tick
TICKgreen check
SECOND
green check
MINUTE
green check
HOUR
green check
DAILY
green check

The default resolution for Forex subscriptions is Resolution.MINUTE. To change the resolution, pass a resolution argument to the add_forex method.

Select Language:
self._symbol = self.add_forex("EURUSD", Resolution.DAILY).symbol

To create custom resolution periods, see Consolidating Data.

Supported Markets

The only market available for Forex pairs is Market.OANDA, so you don't need to pass a market argument to the add_forex method.

Select Language:
self._symbol = self.add_forex("EURUSD", market=Market.OANDA).symbol

The brokerage models have a default market for each asset class. If you set a brokerage model, you may not need to specify the market to use.

Fill Forward

Fill forward means if there is no data point for the current slice, LEAN uses the previous data point. Fill forward is the default data setting. If you disable fill forward, you may get stale fills or you may see trade volume as zero.

To disable fill forward for a security, set the fill_forward argument to false when you create the security subscription.

Select Language:
self._symbol = self.add_forex("EURUSD", fill_forward=False).symbol

Margin and Leverage

LEAN models buying power and margin calls to ensure your algorithm stays within the margin requirements. The OANDA brokerage let's you use up to 50x leverage on margin accounts. To change the amount of leverage you can use for a Forex pair, pass a leverage argument to the add_forex method.

Select Language:
self._symbol = self.add_forex("EURUSD", leverage=35).symbol

Data Normalization

The data normalization mode doesn't affect the data that LEAN passes to on_data or the data from history request. If you change the data normalization mode, it won't change the outcome.

Properties

The add_forex method returns a Forex object, which have the following properties:

Examples

The following examples demonstrate some common practices for requesting Forex data.

Example 1: Add All Forex Pairs

The following algorithm adds all the Forex pairs that trade on the OANDA exchange . To get all of the pairs from the Symbol Properties Database , call the symbol_properties_database.get_symbol_properties_list method. Adding all of the pairs is particularly useful for spotting arbitrage opportunities among the pairs.

Select Language:
class ForexExampleAlgorithm(QCAlgorithm):
    
    def initialize(self) -> None:
        self._forex_pairs = [
            # Add all of the pairs. You don't need to specify the market because the Symbol object already does.
            self.add_forex(x.key.symbol, Resolution.DAILY) 
            # Get all of the OANDA Forex pairs from the Symbol Properties Database.
            for x in self.symbol_properties_database.get_symbol_properties_list(Market.OANDA, SecurityType.FOREX)
        ]

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: