Skip to content
All library documents

UT Bot Trend Signals with a Higher-Timeframe EMA and Staged Exits

Article Strategy library · Author: QuantConnect

Summary

This trend-following approach uses UT Bot ATR trailing levels to generate entries, a 21-period EMA crossover for timing, and a 50-period EMA on a higher timeframe as a directional filter. It describes using Heikin Ashi prices for signals and allows long-only, short-only, or two-sided operation. Exits combine a percentage-based or ATR-based stop with two profit targets, each intended to close part of the position.

The document presents the method and its configurable inputs but supplies no performance statistics or comparative backtest results. It identifies likely weaknesses: trading costs can matter on short timeframes, ranging markets may create false signals, and multiple filters may omit opportunities. The narrative describes one-minute entries and five-minute filtering, while the published backtest settings use daily periods, leaving uncertainty about how the described timeframe setup relates to the reported configuration. Parameters therefore need market-specific evaluation.

Key ideas

  • UT Bot ATR trailing levels and a 21-period EMA crossover define entry timing.
  • A higher-timeframe 50-period EMA filters trades by the broader trend direction.
  • Heikin Ashi prices can be used to calculate signals, with selectable long and short directions.
  • The exit plan combines a stop with two partial profit targets.
  • The document provides no performance evidence and notes costs, ranging-market signals, and parameter sensitivity as risks.

Tags

Full text
# G10CurrencySelectionModelFrameworkAlgorithm


# G10CurrencySelectionModelFrameworkAlgorithm









Provides an implementation of IUniverseSelectionModel that simply subscribes to G10 currencies

Framework algorithm that uses the G10CurrencySelectionModel, a Universe Selection Model that inherits from ManualUniverseSelectionModel

## 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 *
from Selection.ManualUniverseSelectionModel import ManualUniverseSelectionModel

class G10CurrencySelectionModel(ManualUniverseSelectionModel):
    '''Provides an implementation of IUniverseSelectionModel that simply subscribes to G10 currencies'''
    def __init__(self):
        '''Initializes a new instance of the G10CurrencySelectionModel class
        using the algorithm's security initializer and universe settings'''
        super().__init__([Symbol.create(x, SecurityType.FOREX, Market.OANDA)
                            for x in [ "EURUSD",
                                    "GBPUSD",
                                    "USDJPY",
                                    "AUDUSD",
                                    "NZDUSD",
                                    "USDCAD",
                                    "USDCHF",
                                    "USDNOK",
                                    "USDSEK" ]])

### <summary>
### Framework algorithm that uses the G10CurrencySelectionModel,
### a Universe Selection Model that inherits from ManualUniverseSelectionModel
### </summary>
class G10CurrencySelectionModelFrameworkAlgorithm(QCAlgorithm):
    '''Framework algorithm that uses the G10CurrencySelectionModel,
    a Universe Selection Model that inherits from ManualUniverseSelectionMode'''

    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.'''

        # Set requested data resolution
        self.universe_settings.resolution = Resolution.MINUTE

        self.set_start_date(2013,10,7)   #Set Start Date
        self.set_end_date(2013,10,11)    #Set End Date
        self.set_cash(100000)           #Set Strategy Cash

        # set algorithm framework models
        self.set_universe_selection(G10CurrencySelectionModel())
        self.set_alpha(ConstantAlphaModel(InsightType.PRICE, InsightDirection.UP, timedelta(minutes = 20), 0.025, None))
        self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
        self.set_execution(ImmediateExecutionModel())
        self.set_risk_management(MaximumDrawdownPercentPerSecurity(0.01))

    def on_order_event(self, order_event):
        if order_event.status == OrderStatus.FILLED:
            self.debug("Purchased Stock: {0}".format(order_event.symbol))

```

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.