UT Bot Trend Signals with a Higher-Timeframe EMA and Staged Exits
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.