Fisher Yurik Trailing Stop Strategy

Author: ChaoZhang, Date: 2024-02-02 14:57:33
Tags:

img

Overview

The Fisher Yurik trailing stop strategy is a quantitative trading strategy that integrates the Fisher Yurik indicator and trailing stop mechanisms. It uses the Fisher Yurik indicator to generate buy and sell signals while setting trailing stops to lock in profits, maximizing gains while protecting profits.

Strategy Logic

  1. Input date ranges to define backtest/live trading timeframe
  2. Input parameters for Fisher Yurik indicator, default to 2 periods
  3. Input profit taking and stop loss ratios, default to 5% profit and 2% loss
  4. Calculate main and signal lines of Fisher Yurik indicator
  5. Generate buy signal when main line crosses above signal line
  6. Set trailing stop, exit long position when price drops 2% after entry
  7. Take profit when price rises above 5%

Advantage Analysis

  1. Fisher Yurik indicator easily identifies trends, accurate buy signals
  2. Trailing stop locks in most profits while avoiding stops beyond threshold
  3. Customizable parameters suit different market environments
  4. Simple and easy to understand implementation

Risk Analysis

  1. Improper parameter tuning may cause over-aggressive trading, require cautious testing
  2. Stop loss too wide may lead to losses fromoutliers beyond expectations
  3. Take profit too tight may cut wins short, limiting profitability
  4. Appropriate parameters should be determined for different products

Risks can be addressed by adjusting stop/profit ratios, testing parameters, using signal filters, position sizing rules.

Enhancement Opportunities

  1. Optimize Fisher Yurik parameters for impact on strategy
  2. Add signal filters like MACD, KD to improve signal quality
  3. Add entry conditions like breakouts from Bollinger Bands
  4. Incorporate position sizing rules to control per trade risk
  5. Enhance trailing stop methods, e.g. smoothed, Chandelier Exits

Conclusion

The Fisher Yurik trailing stop strategy combines trend identification and risk management. With parameter tuning, indicator combinations, and stop loss enhancements, it can suit most instruments for good profits within acceptable risk tolerances.


/*backtest
start: 2023-01-26 00:00:00
end: 2024-02-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Fisher_Yurik Strategy with Trailing Stop", shorttitle="FY Strategy", overlay=true)

// Date Ranges 
from_month = input(defval = 1, title = "From Month")
from_day   = input(defval = 1, title = "From Day")
from_year  = input(defval = 2021, title = "From Year")
to_month   = input(defval = 1, title = "To Month")
to_day     = input(defval = 1, title = "To Day")
to_year    = input(defval = 9999, title = "To Year")
start  = timestamp(from_year, from_month, from_day, 00, 00)  // backtest start window
finish = timestamp(to_year, to_month, to_day, 23, 59)        // backtest finish window
window = true
period = input(2, title='Period')
cost = input.float(1.05, title='profit level ', step=0.01)
dusus = input.float(1.02, title='after the signal', step=0.01)

var float Value = na
var float Fish = na
var float ExtBuffer1 = na
var float ExtBuffer2 = na

price = (high + low) / 2
MaxH = ta.highest(high, period)
MinL = ta.lowest(low, period)

Value := 0.33 * 2 * ((price - MinL) / (MaxH - MinL) - 0.5) + 0.67 * nz(Value[1])
Value := math.max(math.min(Value, 0.999), -0.999)
Fish := 0.5 * math.log((1 + Value) / (1 - Value)) + 0.5 * nz(Fish[1])

up = Fish >= 0

ExtBuffer1 := up ? Fish : na
ExtBuffer2 := up ? na : Fish

var float entryPrice = na
var float stopPrice = na
 
if (ExtBuffer1 > ExtBuffer1[1])
    entryPrice := close*dusus
    stopPrice := close * cost 
 
if (ExtBuffer2 < ExtBuffer2[1])
    entryPrice := close
    stopPrice := close * cost

// Sadece seçilen test döneminde işlem yapma koşulu eklenmiştir
strategy.entry("Buy", strategy.long, when=ExtBuffer1 > ExtBuffer1[1] and window)
strategy.exit("Take Profit/Trailing Stop", from_entry="Buy", when=(close >= entryPrice * cost) or (close < stopPrice), trail_offset=0.08, trail_price=entryPrice * cost)


More