Strategy vault / Machine learning
Hull Fisher Adaptive Intelligent Multi factor Strategy
This strategy combines the Hull Moving Average, Fisher Transform indicator and the Commodity Channel Index into an adaptive multi-factor strategy. It can intelligently identify trends, automatically adjust…

Overview
This strategy combines the Hull Moving Average, Fisher Transform indicator and the Commodity Channel Index into an adaptive multi-factor strategy. It can intelligently identify trends, automatically adjust parameters, and adapt to different products and cycles.
Strategy Logic
The core logic of this strategy is based on the golden cross and dead cross of the Fisher Transform indicator to determine entry and exit. The Fisher Transform indicator combines the advantages of moving averages and oscillators to more accurately judge turning points.
The strategy first calculates the Hull Moving Average and Fisher Transform indicator. Then with the help of the Commodity Channel Index, form the entry conditions. When the Fisher Transform indicator crosses up from below the zero line or crosses up from outside the set parameter range, it is set as a golden cross condition to form a long signal; when the Fisher Transform crosses down from above the zero line or outside the parameter range, it is set as a dead cross condition to form a short signal.
The exit conditions are the opposite, long orders opened on golden crosses are closed on dead crosses; short orders opened on dead crosses are closed on golden crosses. This uses the crossover of the indicators to capture trend reversal points.
Advantage Analysis
The biggest advantage of this strategy is the adaptive multi-factor. It takes advantage of moving averages, oscillators and trend indicators to perform well in both falling and rising markets. The parameters can also be adjusted according to variety and cycle to achieve adaptability.
In addition, the strategy incorporates an automatic stop loss mechanism. When the price breaks back above the Hull Moving Average, it will automatically stop loss to exit. This greatly reduces the risk of loss for the strategy.
Risks and Solutions
The biggest risk of this strategy is the error signals between the indicators. When the price moves sideways, the indicators may produce some unnecessary crosses. This will lead to unnecessary entry and stop loss.
The solution is to appropriately adjust the indicator parameters to filter out some small signals. Or combine more auxiliary indicators for confirmation. For example, add a volume indicator to determine true signals.
Optimization Directions
The strategy can be optimized in the following directions:
Add machine learning algorithms to achieve automatic parameter optimization. Can train based on historical data and adjust indicator parameters in real time.
Add more indicators for scoring, take majority decision strategy, and improve decision accuracy.
Add a breakout confirmation mechanism that uses important price levels and channels for confirmation again to avoid misoperation.
Add a risk assessment module that can automatically adjust position size and stop loss range based on market conditions.
Conclusion
Overall, this is a very good adaptive multi-factor framework. It combines the trend judgment of moving averages, the overbought and oversold judgments of oscillators, and the application of indicator crosses, forming a complete entry and exit mechanism. If it can be further optimized and increased adaptive and intelligent components, it will become a strategy product with extremely high commercial value.
Parameters
| Name | Default | What it controls |
|---|---|---|
| v_input_1 | 14 | HullMA Length |
| v_input_2 | 9 | Signal Length |
| v_input_3 | 5 | Top Line |
| v_input_4 | -5 | Bottom Line |
| v_input_5_open | 0 | Price data: open | high | low | close | hl2 | hlc3 | hlcc4 | ohlc4 |
| v_input_6 | true | Open when HullFisher crossover outside Lines |
| v_input_7 | true | Open when HullFisher past zero |
| v_input_8 | true | Include Hull_moving_average |
| v_input_9 | true | Include Commodity_channel_index |
| v_input_10 | true | Close order when Fisher crossover |
| v_input_11 | true | Close order when Hull crossover |
Source Pine Script
/*backtest
start: 2023-01-09 00:00:00
end: 2024-01-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is free to copy/paste/use. no permission required. just do it!
// © @SeaSide420
//@version=4
strategy(title="Hull Fisher",currency="USD",default_qty_type=strategy.percent_of_equity,default_qty_value=100,commission_type=strategy.commission.percent,commission_value=0.25)
//=================================== Inputs =========================================================
period =input(title="HullMA Length", type=input.integer, defval=14, minval=2)
length =input(9, minval=1, title="Signal Length")
line1 = input(5, minval=2, title="Top Line")
line5 = input(-5, maxval=-2, title="Bottom Line")
price = input(open, type=input.source, title="Price data")
entry1 =input(true,type=input.bool, title="Open when HullFisher crossover outside Lines")
entry2 =input(true,type=input.bool, title="Open when HullFisher past zero")
useHMA =input(true,type=input.bool, title="Include Hull_moving_average")
useCCI =input(true,type=input.bool, title="Include Commodity_channel_index")
fishclose=input(true,type=input.bool, title="Close order when Fisher crossover")
HMAclose=input(true,type=input.bool, title="Close order when Hull crossover")
//================================ Calculations ======================================================
HMA = hma(price,period)
HMA2 = HMA[1]
high_ = highest(HMA, length)
low_ = lowest(HMA, length)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((HMA - low_) / max(high_ - low_, .001) - .5) + .67 * nz(value[1]))
value1 = 0.0
value1 := .5 * log((1 + value) / max(1 - value, .001)) + .5 * nz(value1[1])
value2 = value1[1]
CCI1 = cci(price,period)
CCI2 = CCI1[1]
line2 = line1/2
line4 = line5/2
//================================ Draw Plots =======================================================
colorchange1 =CCI1>CCI2?color.lime:color.red
colorchange2 =value1>value2?color.lime:color.red
a =plot(line1,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Top Line")
b =plot(line2,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Upper Line")
c =plot(0,style=plot.style_line,color=color.black,transp=50,linewidth=2,title="Middle Line")
d =plot(line4,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Lower Line")
e =plot(line5,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Bottom Line")
f =plot(value1, color=color.black,transp=50,linewidth=2, title="Value 1")
g =plot(value2, color=color.black,transp=50,linewidth=2, title="Value 2")
h =plot(CCI1/50,style=plot.style_area, color=colorchange1,transp=50,linewidth=2, title="CCI")
fill(f,g,color=colorchange2,transp=20,title="Color fill")
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.black, linewidth=10)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.white, linewidth=8)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=colorchange2, linewidth=5)
//============================= Entry conditions ====================================================
// Outside Lines crossover or zero lines crossover
LongCondition1 = value1>value2 and value1<line5 and entry1 and not useCCI and not useHMA
ShortCondition1 = value1<value2 and value1>line1 and entry1 and not useCCI and not useHMA
LongCondition2 = value1>value2 and value1>0 and entry2 and not useCCI and not useHMA
ShortCondition2 = value1<value2 and value1<0 and entry2 and not useCCI and not useHMA
// Use CCI
LongCondition3 = value1>value2 and value1<line5 and CCI1>CCI2 and entry1 and useCCI and not useHMA
ShortCondition3 = value1<value2 and value1>line1 and CCI1<CCI2 and entry1 and useCCI and not useHMA
LongCondition4 = value1>value2 and value1>0 and CCI1>CCI2 and entry2 and useCCI and not useHMA
ShortCondition4 = value1<value2 and value1<0 and CCI1<CCI2 and entry2 and useCCI and not useHMA
// Use HMA
LongCondition5 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and not useCCI and useHMA
ShortCondition5 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and not useCCI and useHMA
LongCondition6 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and not useCCI and useHMA
ShortCondition6 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and not useCCI and useHMA
//Use CCI & HMA
LongCondition7 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and useCCI and useHMA
ShortCondition7 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and useCCI and useHMA
LongCondition8 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and useCCI and useHMA
ShortCondition8 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and useCCI and useHMA
//========================= Exit & Entry excecution =================================================
if HMAclose and fishclose and value1<value2 and HMA<HMA2
strategy.close("BUY")
if HMAclose and fishclose and value1>value2 and HMA>HMA2
strategy.close("SELL")
if HMAclose and HMA<HMA2
strategy.close("BUY")
if HMAclose and HMA>HMA2
strategy.close("SELL")
if fishclose and value1<value2
strategy.close("BUY")
if fishclose and value1>value2
strategy.close("SELL")
if LongCondition1 or LongCondition2 or LongCondition3 or LongCondition4 or LongCondition5 or LongCondition6 or LongCondition7 or LongCondition8
strategy.entry("BUY", strategy.long)
if ShortCondition1 or ShortCondition2 or ShortCondition3 or ShortCondition4 or ShortCondition5 or ShortCondition6 or ShortCondition7 or ShortCondition8
strategy.entry("SELL", strategy.short)
Published by ChaoZhang on the FMZ strategy square · last modified 2024-01-16. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.
Build this with AgenKit
A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/Hull-Fisher-Adaptive-Intelligent-Multi-factor-Strategy.md- npx agenkit install engineering-kit in your project
- Paste the command into your agent and approve each phase
- Get tests, backtest, risk controls and a paper-trading switch
Understand it first
Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.
Related specs
- Triple Moving Average Combined with MACD Quantitative StrategyPine Script · Machine learning · 1d
- kNN based Trend Following StrategyPine Script · Machine learning · 1h
- High Low Cryptocurrency Strategy Based on Multiple IndicatorsPine Script · Machine learning · 45m
- Parabolic SAR and CCI Strategy with EMA Exit for Gold TradingPine Script · Machine learning · 1d
- Multiple EMA Buy StrategyPine Script · Machine learning · 1d
- Dual CCI Quantitative StrategyPine Script · Machine learning · 1h