PowerTower
Tested 1 Jun 2023 – 30 May 2025
Rank 7 of 27 by return
PowerTower turned $1,000 into $1,398 (+39.8%) over 729 days, while holding Bitcoin returned +288.1% and an equal mix of the ten coins +194.8%. Its worst drawdown was 28.0%, a substantial dip to sit through. It won 69% of trades for a profit factor of 1.22.
How PowerTower trades
PowerTower compares each close with the close two candles earlier raised to a tuned power (3.849). It buys when three consecutive comparisons pass and sells as soon as any of the sell comparisons fails.
Raising a price to the power of 3.8 makes the rule behave very differently for a $0.50 coin and a $60,000 coin, which is a sign the parameters were fitted rather than reasoned. Results vary strongly by pair.
Rules at a glance
- Indicators
- Raw close prices
- Take-profit (minimal ROI)
- 21.3% from entry; 4.8% after 39m; 2.9% after 56m; 0% after 2h 39m
- Stoploss
- −28.8%
- Trailing stop
- Off
- Exit signal
- Used
Results by month
Profit or loss in USDT for trades closed in each month.
Results by coin
| Pair | Trades | Win rate | Profit (USDT) | Avg. hold |
|---|---|---|---|---|
| ADA/USDT | 571 | 68.0% | +160.34 | 1d 5h |
| DOGE/USDT | 439 | 70.6% | +130.11 | 1d 15h |
| XRP/USDT | 214 | 66.4% | +107.23 | 2d 11h |
| BTC/USDT | 0 | 0.0% | 0.00 | 0:00 |
| ETH/USDT | 0 | 0.0% | 0.00 | 0:00 |
| SOL/USDT | 0 | 0.0% | 0.00 | 0:00 |
| BNB/USDT | 0 | 0.0% | 0.00 | 0:00 |
| AVAX/USDT | 0 | 0.0% | 0.00 | 0:00 |
| LINK/USDT | 0 | 0.0% | 0.00 | 0:00 |
| DOT/USDT | 0 | 0.0% | 0.00 | 0:00 |
Why trades closed
| Exit reason | Trades | Win rate | Profit (USDT) |
|---|---|---|---|
| Take-profit (ROI) | 1088 | 72.3% | +2,075.49 |
| Exit signal | 105 | 50.5% | +62.56 |
| Still open at end of test | 2 | 0.0% | −60.29 |
| Stoploss | 29 | 0.0% | −1,680.09 |
The code
PowerTower comes from the community freqtrade-strategies repository (GPL-3.0). These are the parts that decide when it trades; the full file is 104 lines.
Entry rules
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['close'].shift(0) > dataframe['close'].shift(2) ** self.buy_pow.value) & (dataframe['close'].shift(1) > dataframe['close'].shift(3) ** self.buy_pow.value) & (dataframe['close'].shift(2) > dataframe['close'].shift(4) ** self.buy_pow.value) ), 'enter_long'] = 1 return dataframe
Exit rules
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[( (dataframe['close'].shift(0) < dataframe['close'].shift(2) ** self.sell_pow.value) | (dataframe['close'].shift(1) < dataframe['close'].shift(3) ** self.sell_pow.value) | (dataframe['close'].shift(2) < dataframe['close'].shift(4) ** self.sell_pow.value) ), 'exit_long'] = 1 return dataframe
Indicators
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: return dataframe
Reproduce this test
With freqtrade installed (see our Docker guide), download the data and run the same backtest:
freqtrade download-data --exchange binance --pairs ADA/USDT AVAX/USDT BNB/USDT BTC/USDT DOGE/USDT DOT/USDT ETH/USDT LINK/USDT SOL/USDT XRP/USDT --timeframes 5m --timerange 20230501-20250530
freqtrade backtesting --strategy PowerTower --timeframe 5m \
--timerange 20230601-20250530 --dry-run-wallet 1000 --stake-amount 200 --max-open-trades 5 --fee 0.001
Results can differ slightly with a different data source or freqtrade version. See how we test.