Skip to content
All library documents

Warming Up Exponential Moving Averages Before Trading

Article Strategy library · Author: QuantConnect

Summary

This educational example shows why an algorithm may need historical data before acting on live or simulated updates. It subscribes to second-resolution SPY data, creates fast and slow exponential moving averages, and requests enough warmup history for the slower indicator. The algorithm waits until warmup ends before logging each indicator's sample count, then holds a long position when the fast average is above the slow average and a short position otherwise.

The example demonstrates indicator initialization and a basic moving-average comparison, rather than evaluating a complete trading strategy. It includes no reported backtest performance, transaction costs, or risk controls, and the short historical date range and fixed indicator periods do not establish that the trading rule is effective. The useful lesson is that indicator-based decisions should be delayed until the required history has populated the indicators; the position rule itself remains a minimal demonstration.

Key ideas

  • The algorithm requests historical warmup data before acting on indicator values.
  • Warmup length is set to the slow exponential moving average's period.
  • After warmup, the fast and slow averages determine whether the algorithm holds long or short.
  • The example illustrates initialization mechanics but provides no evidence that its trading rule is profitable.

Tags

Full text
# WarmupAlgorithm


# WarmupAlgorithm









Demonstration algorithm for the Warm Up feature with basic indicators.

## Source (Apache-2.0)

```python
# 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.

from AlgorithmImports import *

### <summary>
### Demonstration algorithm for the Warm Up feature with basic indicators.
### </summary>
### <meta name="tag" content="indicators" />
### <meta name="tag" content="warm up" />
### <meta name="tag" content="history and warm up" />
### <meta name="tag" content="using data" />
class WarmupAlgorithm(QCAlgorithm):

    def initialize(self):
        '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''

        self.set_start_date(2013,10,8)   #Set Start Date
        self.set_end_date(2013,10,11)    #Set End Date
        self.set_cash(100000)           #Set Strategy Cash
        # Find more symbols here: http://quantconnect.com/data
        self.add_equity("SPY", Resolution.SECOND)

        fast_period = 60
        slow_period = 3600

        self.fast = self.ema("SPY", fast_period)
        self.slow = self.ema("SPY", slow_period)

        self.set_warmup(slow_period)
        self.first = True


    def on_data(self, data):
        '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.'''
        if self.first and not self.is_warming_up:
            self.first = False
            self.log("Fast: {0}".format(self.fast.samples))
            self.log("Slow: {0}".format(self.slow.samples))

        if self.fast.current.value > self.slow.current.value:
            self.set_holdings("SPY", 1)
        else:
            self.set_holdings("SPY", -1)

```

Shown in full with attribution under the source's licence. Licence: Apache-2.0

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.