//@version=6
indicator(title="Indicator: Long Exit Conditions", overlay=false, max_lines_count=500, max_labels_count=500)

import TradingView/ta/10
import NiceOrbit/LibraryUtility/8 as utils
import NiceOrbit/LibraryRSIDivergence/1 as rsiDiv
import NiceOrbit/LibraryGaussianChannel/1 as gcl
import NiceOrbit/LibraryMACD/9 as macdLib
import NiceOrbit/LibraryMoneySupply/7 as libMoneySupply
import NiceOrbit/LibraryStochasticDivergence/3 as libStochDiv
import NiceOrbit/LibraryVWAPDivergence/3 as libVwapDiv
import NiceOrbit/LibraryRealizedPrice/4 as libRealizedPrice
import NiceOrbit/LibraryLongExit/5 as libLongExit

// =====================================================================================================================
// PLOTTING CONTROLS
// =====================================================================================================================
group_plotting_controls = "Plotting Controls"
i_plot_baseline = input.float(0, "Baseline", group = group_plotting_controls, display=display.all-display.status_line)
i_plot_increment = input.float(1, "Increment", group = group_plotting_controls, display=display.all-display.status_line)
i_plot_line_width = input.int(3, "Line Width", group = group_plotting_controls, display=display.all-display.status_line)

// =====================================================================================================================
// DUPLICATED INPUTS & LOGIC (MUST BE KEPT IN SYNC WITH MainStrategy.pine)
// =====================================================================================================================

//{ Date, Condition switches & Settings  ======================
group_date_range                        = "Back Testing Date Range"
startDate                               = input.time(timestamp("1 January 2018"), "Start", group=group_date_range, inline="date", display=display.none)
endDate                                 = input.time(timestamp("1 July 2024 23:59 +0000"), "End ", group=group_date_range, inline="date", display=display.none)
timeCondition                           = time >= startDate and time <= endDate

group_general_settings                = "General Setings"
i_log_variables_to_list_of_trades       = input.bool(false, title="Log Variables on each trade in List of Trades", group=group_general_settings,display=display.none)
i_enable_timeframe_adjustment           = input.bool(true, title="Enable Time Frame Adjustment", group=group_general_settings,display=display.none, tooltip = "For timeframes shorter than 1 Day, adjusted to use more bars to keep same range of data as 1 day would")

timeframe_divisor = utils.f_resInDays()

// Stop Loss Inputs
i_longStopLossEnabled   = input.bool(true, title="(T)Enable Stop Loss", group=group_general_settings, tooltip="Enable to have stop losses applied to long entries", display=display.none, inline="StopLoss")
i_longStopLossSrc       = input.source(close,  title="Source", group=group_general_settings, tooltip="Price Source", display=display.none, inline="StopLoss")
i_longStopLossPercent   = input.float(25.0, title="%(25)", group=group_general_settings, tooltip="Enter at which percentage that you want stop loss applied.", display=display.none, inline="StopLoss") / 100 
i_useAtrStop            = input.bool(false, title="(F)Use ATR Stop", group=group_general_settings, tooltip="If true, the stop loss is based on a multiple of the ATR instead of a percentage.", display=display.none, inline="AtrStop")
i_atrLength             = input.int(7, "Length", group=group_general_settings, display=display.none, inline="AtrStop")
i_atrMultiplier         = input.float(4, "Multiplier", group=group_general_settings, display=display.none, inline="AtrStop")
if i_enable_timeframe_adjustment
    i_atrLength := int(i_atrLength / timeframe_divisor) > 5000 ? 5000 : int(i_atrLength / timeframe_divisor)

i_use_trailing_stoploss = input.bool(true, group=group_general_settings, title=" (T)Use Trailing Stop", tooltip="If enabled the stop loss price adjusts along the way based on current price", display=display.none)

var longStopPrice = 0.0

atrValue = ta.atr(i_atrLength)
stopLossOffset = i_useAtrStop ? (atrValue * i_atrMultiplier) : (i_longStopLossSrc * i_longStopLossPercent)
potentialLongStopPrice = i_longStopLossSrc - stopLossOffset

if i_use_trailing_stoploss and (potentialLongStopPrice > longStopPrice)
    longStopPrice := potentialLongStopPrice

group_LongExit_Enabled                  = "Long Exit Types Enabled"
i_enable_longExitCondition_rsiSlowingBearishDivergence          = input.bool(false, title="  F-Slowing Bearish Confirmation", group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rsiDelayedPeakDivergence             = input.bool(true,  title="  ?D-Delayed Peak Divergence", group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rsiRegularBearishDivergence          = input.bool(true,  title="  D-Regular Bearish Divergence",group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rsiHiddenBearishDivergence           = input.bool(true,  title="  ?D-Hidden Bearish Divergence",group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rsiConfirmedBearishDivergence        = input.bool(true,  title="  ?D-Confirmed Bearish Divergence",group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rsiRealTimeBearishDivergence         = input.bool(false, title="  F1-RealTimeBearishDivergence",group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rsiRealTimeBearishVWAPDivergenceA    = input.bool(true,  title="  D-RealTimeBearishVWAPDivergenceA",group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rsiRealTimeBearishVWAPDivergenceB    = input.bool(false, title="  Test-RealTimeBearishVWAPDivergenceB",group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_stochbearish_negative_diffs          = input.bool(false, title="  Test-stochbearish_negative_diffs",group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_crossUnderCloseHband                 = input.bool(true,  title="  D-crossUnderCloseHband", group=group_LongExit_Enabled,display=display.none)
i_enable_longExitCondition_rocHMALongExitUnderThreshold         = input.bool(false, title="  F-rocHMALongExitUnderThreshold", group=group_LongExit_Enabled,display=display.none )
i_enable_longExitCondition_rocLongExitCondition                 = input.bool(true,  title=" D?-rocLongExitCondition", group=group_LongExit_Enabled,display=display.none )
i_enable_longExitCondition_volatilityCondition                  = input.bool(false, title="  F-volatilityCondition", group=group_LongExit_Enabled,display=display.none )
i_enable_longExitCondition_macd_crossUnderPrediction            = input.bool(false, title="  F-MACD cross-under prediction", group=group_LongExit_Enabled, display=display.none )
i_enable_longExitCondition_shortEntryCondition                  = input.bool(true,  title="  D-Short Entry as Long Exit", group=group_LongExit_Enabled, display=display.none )
i_enable_longExitCondition_macd_crossUnder                      = input.bool(false, title="  F-macd_crossUnder", group=group_LongExit_Enabled)
i_enable_longExitCondition_stochastic_divergence                = input.bool(false, title="  F2-stochastic_divergence", group=group_LongExit_Enabled)
i_enable_longExitCondition_stochbearish_vwap_bearish_macd_hist_rising     = input.bool(true, title="  D-stochbearish_vwap_bearish_macd_hist_rising", group=group_LongExit_Enabled, display=display.none)
i_enable_longExitCondition_stochbearish_vwap_bearish_macd_flipped_bearish = input.bool(true, title="  D-stochbearish_vwap_bearish_macd_flipped_bearish", group=group_LongExit_Enabled, display=display.none)
i_enable_longExitCondition_isM2MacdLongCrossBearish             = input.bool(false, title=" ₙF6-isM2MacdLongCrossBearish", group=group_LongExit_Enabled, display=display.none )
i_enable_longExitCondition_isM2MacdShortCrossBearish            = input.bool(false, title="  F3-isM2MacdShortCrossBearish", group=group_LongExit_Enabled, display=display.none )
i_enable_longExitCondition_m2_diff_less_than                    = input.bool(false, title="  F4-m2_diff_less_than", group=group_LongExit_Enabled, display=display.none, inline="m2diff")
i_enable_longExitCondition_m2_diff_less_than_diff_less_than     = input.float(-4.0, title="  less_than", group=group_LongExit_Enabled, display=display.none, inline="m2diff")
i_enable_longExitCondition_m2Macd_shortOffsetDifference_under_0     = input.bool(true, title="  D-m2Macd_shortOffsetDifference_under_0", group=group_LongExit_Enabled, display=display.none )
i_enable_longExitCondition_up_spike_when_isM2SmoothedTinyOffsetFlat = input.bool(true, title="  D-up_spike_when_isM2SmoothedTinyOffsetFlat", group=group_LongExit_Enabled, display=display.none )
i_enable_longExitCondition_stochbearish_stoch_over_N            = input.bool(false, title="  F4-stochbearish_stoch_over_N", group=group_LongExit_Enabled, display=display.none, inline="stoch_over_N")
i_longExitCondition_stoch_over_N_threshold                      = input.int(80,     title="stoch threshold(80)", tooltip="stochastic value over this number will be included in filter", group=group_LongExit_Enabled, display=display.none, inline="stoch_over_N")
i_longExitCondition_rsi_over_N_threshold                        = input.int(70,     title="rsi threshold(70)", tooltip="rsi value over this number will be included in filter", group=group_LongExit_Enabled, display=display.none, inline="stoch_over_N")
i_longExitCondition_macd_slope_current_under_N_threshold        = input.int(-20,    title="macd slope threshold(-20)", tooltip="macd_slope_current under over this number will be included in filter", group=group_LongExit_Enabled, display=display.none, inline="stoch_over_N")
i_enable_longExitCondition_stochastic_divergence_isFalling      = input.bool(false, title="  F2-stochastic_divergence_isFalling", group=group_LongExit_Enabled, inline="stochastic_divergence_isFalling_rsid_threshold", display=display.none)
i_enable_stochastic_divergence_isFalling_rsid_threshold         = input.int(85,     title="RSID_OSC threshold", group=group_LongExit_Enabled, inline="stochastic_divergence_isFalling_rsid_threshold", display=display.none)
i_enable_longExitCondition_isFalling_short_high_rsi_high_stoch  = input.bool(true,  title="  D-isFalling_short_high_rsi_high_stoch", group=group_LongExit_Enabled, display=display.none)
i_enable_longExitCondition_realized_price_bear_cond             = input.bool(false, title="  realized_price_bear_cond", group=group_LongExit_Enabled, display=display.none)

groupTestExits = "Exit conditions under test"
i_enable_longExitCondition_filtered_realized_price_bear_cond    = input.bool(false, title="  filtered_realized_price_bear_cond", group=groupTestExits, display=display.none)
i_enable_longExitCondition_realized_price_bear_div              = input.bool(false, title="  realized_price_bear_div", group=groupTestExits, display=display.none)
i_enable_longExitCondition_realized_price_bear_div_tiny         = input.bool(false, title="  realized_price_bear_div_tiny", group=groupTestExits, display=display.none)
i_enable_longExitCondition_realized_price_crossUnderUpper       = input.bool(false, title="  realized_price_crossUnderUpper", group=groupTestExits, display=display.none)
i_enable_longExitCondition_isFalling_smoothedM3_no_offset       = input.bool(false, title="  isFalling_smoothedM3_no_offset", group=groupTestExits, display=display.none)
i_enable_longExitCondition_testCondition                        = input.bool(false, title="  Test Condition", group=groupTestExits, display=display.none)

//}

//{ M3 Indicator Code }
groupM3          = "M3 Settings"
m3_growth_rate_period        = input.int(92, "92D-Daily percent gain period", group=groupM3,display=display.none)
m3_globalSmoothingMethod          = input.string(title="Money Supply Smoothing Method", options=["None", "Simple Moving Average", "Exponential Moving Average", "Hull Moving Average"],  defval="None", group=groupM3, display=display.none)
m3_globalSmoothingPeriod          = input.int(title="Money Supply Smoothing Period",  defval=14, minval=1, group=groupM3, display=display.none)
smoothM3SmoothingMethod           = input.string(title="Smooth M3 Moving Average", options=["None", "Simple Moving Average", "Exponential Moving Average", "Hull Moving Average"], defval="Exponential Moving Average", group=groupM3, display=display.none)
smoothM3SmoothingPeriod           = input.int(title="Smooth M3 Smoothing Period", defval=5, minval=1, group=groupM3, display=display.none)
m3ShortEntryThreshold             = input.float(1.85, "M3 Short Entry Threshold, must be over this for entry", step=0.05, group=groupM3, display=display.none)
m3_growthRateTrendShortEntryThreshold        = input.float(-0.5, "M3 Trend Short Entry Threshold, must be under this for entry", step=0.10, group=groupM3, display=display.none)
m3_growthRateTrend2ShortEntryThreshold       = input.float(-0.5, "M3 Trend 2 Short Entry Threshold, must be under this for entry", step=0.10, group=groupM3, display=display.none)
m3_growthRateTrendsShortEntrySummedThreshold = input.float(-1.3, "M3 Trends Summed Short Entry Threshold, must be under this for entry", step=0.10, group=groupM3, display=display.none)

moneySupplyInputs = libMoneySupply.MoneySupplySettings.new()
moneySupplyInputs.m3_growth_rate_period := m3_growth_rate_period
moneySupplyInputs.m3_globalSmoothingMethod := m3_globalSmoothingMethod
moneySupplyInputs.m3_globalSmoothingPeriod := m3_globalSmoothingPeriod
moneySupplyInputs.smoothM3SmoothingMethod := smoothM3SmoothingMethod
moneySupplyInputs.smoothM3SmoothingPeriod := smoothM3SmoothingPeriod
moneySupplyInputs.i_enable_timeframe_adjustment := i_enable_timeframe_adjustment
moneySupplyInputs.timeframe_divisor := timeframe_divisor

moneySupplyData = libMoneySupply.calculate_money_supply(moneySupplyInputs)
m2_US_EU_CN = moneySupplyData.m2_US_EU_CN
m3_global = moneySupplyData.m3_global
m3_global_smoothed = moneySupplyData.m3_global_smoothed
m3_growth_rate = moneySupplyData.m3_growth_rate
m3_growth_rate_smoothed = moneySupplyData.m3_growth_rate_smoothed    
m3_growthRateTrend        = m3_growth_rate_smoothed - nz(m3_growth_rate_smoothed[1], m3_growth_rate_smoothed)
m3_growthRateTrend2       = m3_growth_rate_smoothed - nz(m3_growth_rate_smoothed[2], m3_growth_rate_smoothed)
//}

//{ Hullman Moving Average Indicators, fast moving average on m3_growth_rate }
hma_length                  = input(30, "HMA Length",group=groupM3, display=display.none)
hmaTrend_slope_period       = input.int(2, "hmaTrend_slope_period",group=groupM3, display=display.none)
hma_period_LongExit         = input(63, "HMA Period LongExit",group=groupM3, display=display.none)
rocHMALongExitThreshold     = input.float(-6.5,"rocHMALongExitThreshold", step=0.1,group=groupM3, display=display.none)

if i_enable_timeframe_adjustment
    hma_length                  := int(hma_length / timeframe_divisor) > 5000 ? 5000 : int(hma_length / timeframe_divisor) 
    hmaTrend_slope_period       := int(hmaTrend_slope_period / timeframe_divisor) > 5000 ? 5000 : int(hmaTrend_slope_period / timeframe_divisor) 
    hma_period_LongExit         := int(hma_period_LongExit / timeframe_divisor) > 5000 ? 5000 : int(hma_period_LongExit/ timeframe_divisor) 

hma = ta.hma(m3_growth_rate_smoothed, hma_length)
rocHMALongExit           = (hma - hma[hma_period_LongExit]) / hma[hma_period_LongExit]
//}

//{ MACD Setup }
macd_settings = macdLib.MACDSettings.new()
macd_settings.fast_length           := input.int(12,"Fast Length", group="MACD", display=display.none)
macd_settings.slow_length           := input.int(26,"Slow Length", group="MACD", display=display.none)
macd_settings.signal_length         := input.int(9,"Signal Smoothing",minval=1,maxval=50,group="MACD", display=display.none)
macd_settings.sma_source            := input.string("EMA","Oscillator MA Type",options=["SMA","EMA"],group="MACD", display=display.none)
macd_settings.sma_signal            := input.string("EMA","Signal Line MA Type",options=["SMA","EMA"],group="MACD", display=display.none)
macd_settings.bullishFlipSignalBars := input.int(1, "Stability in bars before bullish flip(1D=1)",group="MACD", display=display.none)
macd_settings.bearishFlipSignalBars := input.int(2, "Stability in bars before bearish flip",group="MACD", display=display.none)
macd_settings.i_macd_slope_threshold_percent := input(-9.0, "MACD Slope Threshold (%)", group="MACD", display=display.none)
macd_settings.nBarsOut              := input.int(5,"N bars in the future to predict crossover(1D=5)",group="MACD", display=display.none)

macd_source  = input(title="Source",defval=close, group="MACD", display=display.none)
macd_results = macdLib.calculate_macd(macd_source, macd_settings)

macd = macd_results.macd
signal = macd_results.signal
macd_is_decreasing = macd_results.macd_is_decreasing
macd_prediction = macd_results.macd_prediction
macd_flipped_bearish = macd_results.macd_flipped_bearish
macdLongExitCondition = macd_results.macdLongExitCondition
isMacdMinusMacdOneRising = macd_results.isMacdMinusMacdOneRising
//}

//{ Gaussian Channel Inputs }
groupGAUSSIAN = "Gaussian Settings"
poles           = input.int(defval=1, title="Poles", minval=1, maxval=9, group=groupGAUSSIAN, display=display.none)
per             = input.int(defval=146, title="Sampling Period", minval=2, group=groupGAUSSIAN, display=display.none)
mult            = input.float(defval=1.15, title="Filtered True Range Multiplier", minval=0, group=groupGAUSSIAN, display=display.none)
modeLag         = input.bool(defval=false, title="Reduced Lag Mode", group=groupGAUSSIAN, display=display.none)
modeFast        = input.bool(defval=false, title="Fast Response Mode", group=groupGAUSSIAN, display=display.none)
gaussian_src    = input(low, title="Gaussian Source(low)", group=groupGAUSSIAN, display=display.none)

groupAMA        = "Adaptive MA Settings"
use_ama         = input.bool(true, "Use Adaptive MA", group=groupAMA, display=display.none)
ama_length      = input.int(3, "AMA Length(3)", minval=1, group=groupAMA, display=display.none)
ama_fast        = input.int(3, "AMA Fast Period(3)", minval=1, group=groupAMA, display=display.none)
ama_slow        = input.int(30, "AMA Slow Period(30)", minval=1, group=groupAMA, display=display.none)

if i_enable_timeframe_adjustment
    ama_length  := int(ama_length / timeframe_divisor) > 5000 ? 5000 : int(ama_length / timeframe_divisor)
    ama_fast    := int(ama_fast / timeframe_divisor) > 5000 ? 5000 : int(ama_fast / timeframe_divisor) 
    ama_slow    := int(ama_slow / timeframe_divisor) > 5000 ? 5000 : int(ama_slow / timeframe_divisor) 

settings = gcl.GaussianSettings.new(poles, per, mult, modeLag, modeFast, use_ama, ama_length, ama_fast, ama_slow, false)
[hband, lband, ma, gaussianGreen] = gcl.calc( gaussian_src, settings)
//}

//{ Stochastic RSI Calculation }
groupStochRSI       = "Stochastic RSI Settings"
smoothK             = input.int(4,  "K", minval=1, group= groupStochRSI, display=display.none)
smoothD             = input.int(3,  "D", minval=1, group= groupStochRSI, display=display.none)
lengthRSI           = input.int(10, "RSI Length", minval=1, group= groupStochRSI, display=display.none)
lengthStoch         = input.int(17, "Stochastic Length", minval=1, group= groupStochRSI, display=display.none)
src_stoch           = input(close,  title="RSI Source", group= groupStochRSI, display=display.none)
stoch_tf            = input.timeframe("", "Stoch RSI Timeframe", group= groupStochRSI, display=display.none)
calcStoch()         => ta.sma(ta.stoch(ta.rsi(src_stoch, lengthRSI), ta.rsi(src_stoch, lengthRSI), ta.rsi(src_stoch, lengthRSI), lengthStoch), smoothK)
stoch_value         = stoch_tf == "" ? calcStoch() : request.security(syminfo.tickerid, stoch_tf, calcStoch(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

if i_enable_timeframe_adjustment
    lengthRSI      := int(lengthRSI / timeframe_divisor) > 5000 ? 5000 : int(lengthRSI / timeframe_divisor)
    lengthStoch    := int(lengthStoch / timeframe_divisor) > 5000 ? 5000 : int(lengthStoch / timeframe_divisor)
//}

//{ Stochastic Divergence}
groupStochDiv = "Stochastic Divergence"
stochDivSettings = libStochDiv.StochasticDivergenceSettings.new()
stochDivSettings.stochLength := input.int(14, title="Stochastic Length", minval=1, group=groupStochDiv, display=display.none)
stochDivSettings.smoothK := input.int(3, title="K Smoothing", minval=1, group=groupStochDiv, display=display.none)
stochDivSettings.smoothD := input.int(3, title="D Smoothing", minval=1, group=groupStochDiv, display=display.none)
stochDivSettings.maTypeK := input.string("Simple Moving Average", "MA Type K", options=["Simple Moving Average", "Exponential Moving Average", "Weighted Moving Average", "Hull Moving Average", "Volume Weighted Moving Average", "Volume Weighted Average Price", "None"], group=groupStochDiv, display=display.none)
stochDivSettings.maTypeD := input.string("Exponential Moving Average", "MA Type D", options=["Simple Moving Average", "Exponential Moving Average", "Weighted Moving Average", "Hull Moving Average", "Volume Weighted Moving Average", "Volume Weighted Average Price", "None"], group=groupStochDiv, display=display.none)
stochDivSettings.pivotLookback := input.int(5, title="Pivot Lookback Bars", minval=1, group=groupStochDiv, display=display.none)
stochDivSettings.divergenceStrength := input.int(2, title="Divergence Strength (bars away)", minval=1, group=groupStochDiv, display=display.none)

if i_enable_timeframe_adjustment
    stochDivSettings.stochLength   := int(stochDivSettings.stochLength / timeframe_divisor) > 5000 ? 5000 : int(stochDivSettings.stochLength / timeframe_divisor)
    stochDivSettings.pivotLookback := int(stochDivSettings.pivotLookback / timeframe_divisor) > 5000 ? 5000 : int(stochDivSettings.pivotLookback / timeframe_divisor)

[stoch_bullishDivergence, stoch_bearishDivergence] = libStochDiv.f_calc(stochDivSettings)
//}

//{ VWAP Divergence }
groupVwapDiv = "VWAP Divergence"
vwapDivSettings = libVwapDiv.VWAPDivergenceSettings.new()
vwapDivSettings.pivotLookbackLeft := input.int(1, title="Pivot Lookback Bars Left", minval=1, group=groupVwapDiv, display=display.none)
vwapDivSettings.pivotLookbackRight := input.int(1, title="Pivot Lookback Bars Right", minval=1, group=groupVwapDiv, display=display.none)
vwapDivSettings.divergenceStrength := input.int(2, title="Divergence Strength (bars away)", minval=1, group=groupVwapDiv, display=display.none)

[vwap_bullishDivergence, vwap_bearishDivergence] = libVwapDiv.f_calc(vwapDivSettings)
//}

//{ M3 ROC }
groupM3ROC                      = "M3 Growth Rate Rate of Change"
m3ROCEnabledExit                = input.string("Disabled", "Include Rate of Change of M3 on Long Exit",  options=["Disabled","Enabled"], group=groupM3ROC, display=display.none)
m3_growth_rate_smoothed_rocLongExitThreshold   = input.float(-15, "m3_growth_rate_smoothed_rocLongExitThreshold(-15)", step=1.0, group=groupM3ROC, display=display.none)
roc_period                      = input.int(2, "ROC Period", group=groupM3ROC, display=display.none)
rocLongExitSource               = input.string("smoothed_roc", "ROC Source for Long Exit",  options=["m3_growthRateRocPercentage","smoothed_roc"], group=groupM3ROC, display=display.none)

if i_enable_timeframe_adjustment
    roc_period      := int(roc_period / timeframe_divisor) > 5000 ? 5000 : int(roc_period / timeframe_divisor) 

m3_growth_rate_roc  = ((m3_growth_rate_smoothed - nz(m3_growth_rate_smoothed[roc_period])) / nz(m3_growth_rate_smoothed[roc_period]))
m3_growthRateRocPercentage = m3_growth_rate_roc * 100
float exitROcM3     = rocLongExitSource  == "m3_growthRateRocPercentage" ? m3_growthRateRocPercentage : m3_growth_rate_roc
bool rocLongExitCondition  = (m3ROCEnabledExit == "Enabled") and (exitROcM3 <= m3_growth_rate_smoothed_rocLongExitThreshold)
//}

//{ M2LeadingIndicator Indicator }
group_m2LeadingIndicator_calculations  = "M2 Leading Indicator Calculations"
m2LeadingIndicator_scalingLookback     = input.int(150, title="Scaling Lookback Period(150)", minval=2, group=group_m2LeadingIndicator_calculations, tooltip="Number of bars used to find the min/max values for scaling the M2 plots.", display=display.none)
i_m2LeadingIndicator_smoothingMethod   = input.string("Hull Moving Average", title="M2 Smoothing Method", options=["None", "Simple Moving Average", "Exponential Moving Average", "Hull Moving Average"], group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_barsToRightOfShortLength = input.int(10,"Bars from short length for diff/slope calculations(10)", group=group_general_settings, display=display.none, tooltip = "Value used in multiple entry and exit calculations, huge effect on performance")
i_m2LeadingIndicator_microOffset       = input.int(3, title= "Micro offset, orange line(3)", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_miniOffset        = input.int(10, title="Mini offset, orange line(10)", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_tinyOffset        = input.int(48, "Tiny offset, orange line(48)", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_shortOffset       = input.int(64, "Short offset, orange line(64)", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_shortOffset_smoothingLength = input.int(13, "Short Offset Smoothing Length(13)", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_mediumOffset      = input.int(78, "Medium offset, red line", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_mediumOffset_smoothingLength = input.int(16, "Medium Offset Smoothing Length", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_longOffset        = input.int(92, "Long offset, yellow line(92)", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_longOffset_smoothingLength = input.int(20, "Long Offset Smoothing Length", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_riseFallLength    = input.int(3, "Length to use for calculating Rise/Fall", group=group_m2LeadingIndicator_calculations, display=display.none)
i_m2LeadingIndicator_oneDayOffset      = input.int(1, "Adjustment factor for one day, unclear if scaling it is needed", group=group_m2LeadingIndicator_calculations, display=display.none)  

if i_enable_timeframe_adjustment
    m2LeadingIndicator_scalingLookback                := int(m2LeadingIndicator_scalingLookback / timeframe_divisor) > 5000 ? 5000 : int(m2LeadingIndicator_scalingLookback/ timeframe_divisor)
    i_m2LeadingIndicator_barsToRightOfShortLength     := int(i_m2LeadingIndicator_barsToRightOfShortLength / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_barsToRightOfShortLength/ timeframe_divisor)
    i_m2LeadingIndicator_tinyOffset                   := int(i_m2LeadingIndicator_tinyOffset / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_tinyOffset/ timeframe_divisor)
    i_m2LeadingIndicator_shortOffset                  := int(i_m2LeadingIndicator_shortOffset / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_shortOffset / timeframe_divisor)
    i_m2LeadingIndicator_shortOffset_smoothingLength  := int(i_m2LeadingIndicator_shortOffset_smoothingLength / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_shortOffset_smoothingLength/ timeframe_divisor)
    i_m2LeadingIndicator_mediumOffset                 := int(i_m2LeadingIndicator_mediumOffset / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_mediumOffset / timeframe_divisor)
    i_m2LeadingIndicator_mediumOffset_smoothingLength := int(i_m2LeadingIndicator_mediumOffset_smoothingLength / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_mediumOffset_smoothingLength/ timeframe_divisor)
    i_m2LeadingIndicator_longOffset                   := int(i_m2LeadingIndicator_longOffset / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_longOffset / timeframe_divisor)
    i_m2LeadingIndicator_longOffset_smoothingLength   := int(i_m2LeadingIndicator_longOffset_smoothingLength / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_longOffset_smoothingLength/ timeframe_divisor)
    i_m2LeadingIndicator_riseFallLength               := int(i_m2LeadingIndicator_riseFallLength  / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_riseFallLength / timeframe_divisor)
    i_m2LeadingIndicator_oneDayOffset                 := int(i_m2LeadingIndicator_oneDayOffset  / timeframe_divisor) > 5000 ? 5000 : int(i_m2LeadingIndicator_oneDayOffset / timeframe_divisor)

m2_smoothed_microOffset     = utils.f_ma(m2_US_EU_CN, i_m2LeadingIndicator_smoothingMethod, i_m2LeadingIndicator_shortOffset_smoothingLength)
m2_smoothed_miniOffset      = utils.f_ma(m2_US_EU_CN, i_m2LeadingIndicator_smoothingMethod, i_m2LeadingIndicator_shortOffset_smoothingLength)
m2_smoothed_tinyOffset      = utils.f_ma(m2_US_EU_CN, i_m2LeadingIndicator_smoothingMethod, i_m2LeadingIndicator_shortOffset_smoothingLength)
m2_smoothed_shortOffset     = utils.f_ma(m2_US_EU_CN, i_m2LeadingIndicator_smoothingMethod, i_m2LeadingIndicator_shortOffset_smoothingLength)
m2_smoothed_mediumOffset    = utils.f_ma(m2_US_EU_CN, i_m2LeadingIndicator_smoothingMethod, i_m2LeadingIndicator_mediumOffset_smoothingLength)
m2_smoothed_longOffset      = utils.f_ma(m2_US_EU_CN, i_m2LeadingIndicator_smoothingMethod, i_m2LeadingIndicator_longOffset_smoothingLength)

m2_smoothedTinyOffsetSlope     = m2_smoothed_shortOffset[i_m2LeadingIndicator_tinyOffset] - m2_smoothed_shortOffset[(i_m2LeadingIndicator_tinyOffset + i_m2LeadingIndicator_oneDayOffset) > 5000 ? 5000 : (i_m2LeadingIndicator_tinyOffset + i_m2LeadingIndicator_oneDayOffset)]
m2_smoothedShortOffsetSlope    = m2_smoothed_shortOffset[i_m2LeadingIndicator_shortOffset] - m2_smoothed_shortOffset[(i_m2LeadingIndicator_shortOffset + i_m2LeadingIndicator_oneDayOffset) > 5000 ? 5000 : (i_m2LeadingIndicator_shortOffset + i_m2LeadingIndicator_oneDayOffset)]

isM2SmoothedMiniOffsetRising     = ta.rising(m2_smoothed_miniOffset, i_m2LeadingIndicator_riseFallLength)
isM2SmoothedTinyOffsetRising     = ta.rising(m2_smoothed_shortOffset, i_m2LeadingIndicator_riseFallLength)
isM2SmoothedShortOffsetRising    = ta.rising(m2_smoothed_shortOffset, i_m2LeadingIndicator_riseFallLength)
isM2SmoothedMediumOffsetRising   = ta.rising(m2_smoothed_mediumOffset, i_m2LeadingIndicator_riseFallLength)
isM2SmoothedLongOffsetRising     = ta.rising(m2_smoothed_longOffset, i_m2LeadingIndicator_riseFallLength)

isFalling_smoothedM3_no_offset= ta.falling(m3_global_smoothed, i_m2LeadingIndicator_riseFallLength)

isM2SmoothedTinyOffsetFalling    = ta.falling(m2_smoothed_shortOffset, i_m2LeadingIndicator_riseFallLength)
isM2SmoothedShortOffsetFalling   = ta.falling(m2_smoothed_shortOffset, i_m2LeadingIndicator_riseFallLength)
isM2SmoothedMediumOffsetFalling  = ta.falling(m2_smoothed_mediumOffset, i_m2LeadingIndicator_riseFallLength)
isM2SmoothedLongOffsetFalling    = ta.falling(m2_smoothed_longOffset, i_m2LeadingIndicator_riseFallLength)

isM2SmoothedShortOffsetFlat      = not isM2SmoothedShortOffsetRising  and not isM2SmoothedShortOffsetFalling
isM2SmoothedMediumOffsetFlat     = not isM2SmoothedMediumOffsetRising and not isM2SmoothedMediumOffsetFalling

m2_smoothed_tinyOffset   := utils.f_scale_ToRange(m2_smoothed_tinyOffset,  m2LeadingIndicator_scalingLookback, m2LeadingIndicator_scalingLookback)
m2_smoothed_shortOffset  := utils.f_scale_ToRange(m2_smoothed_shortOffset,  m2LeadingIndicator_scalingLookback, m2LeadingIndicator_scalingLookback)
m2_smoothed_mediumOffset := utils.f_scale_ToRange(m2_smoothed_mediumOffset, m2LeadingIndicator_scalingLookback, m2LeadingIndicator_scalingLookback)
m2_smoothed_longOffset   := utils.f_scale_ToRange(m2_smoothed_longOffset,   m2LeadingIndicator_scalingLookback, m2LeadingIndicator_scalingLookback)

m2_smoothedShort_N_bars_out        = m2_smoothed_shortOffset[i_m2LeadingIndicator_shortOffset - i_m2LeadingIndicator_barsToRightOfShortLength]
m2_tinyOffsetDiffToNbarsOut        = m2_smoothed_tinyOffset[i_m2LeadingIndicator_tinyOffset - i_m2LeadingIndicator_barsToRightOfShortLength] - m2_smoothed_tinyOffset[i_m2LeadingIndicator_tinyOffset]
m2_shortOffsetDiffToNbarsOut       = m2_smoothedShort_N_bars_out - m2_smoothed_shortOffset[i_m2LeadingIndicator_shortOffset]
m2_mediumOffsetDiffTo12barsOut     = m2_smoothed_shortOffset[i_m2LeadingIndicator_shortOffset - i_m2LeadingIndicator_barsToRightOfShortLength] - m2_smoothed_shortOffset[i_m2LeadingIndicator_mediumOffset]
m2_smoothedTinyOffsetSlope_diff    = m2_smoothedTinyOffsetSlope - m2_smoothedTinyOffsetSlope[1]
m2_smoothedShortOffsetSlope_diff   = m2_smoothedShortOffsetSlope - m2_smoothedShortOffsetSlope[1]
//}

//{ M2 MACD Calculations
group_m2_macd       = "M2 MACD Settings"
i_m2Macd_fastLength     = input.int(50, title="Fast Length", minval=1,  group=group_m2_macd, tooltip="Fast Moving Average length for MACD calculation on *Original* Total M2.", display=display.none)
i_m2Macd_slowLength     = input.int(200, title="Slow Length", minval=1, group=group_m2_macd, tooltip="Slow Moving Average length for MACD calculation on *Original* Total M2.", display=display.none)
i_m2Macd_signalLength   = input.int(9, title="Signal Length", minval=1, group=group_m2_macd, tooltip="Signal Line smoothing length for MACD.", display=display.none)

if i_enable_timeframe_adjustment
    i_m2Macd_fastLength   := int(i_m2Macd_fastLength / timeframe_divisor) > 5000 ? 5000 : int(i_m2Macd_fastLength / timeframe_divisor)
    i_m2Macd_slowLength   := int(i_m2Macd_slowLength / timeframe_divisor) > 5000 ? 5000 : int(i_m2Macd_slowLength / timeframe_divisor)
    i_m2Macd_signalLength := int(i_m2Macd_signalLength / timeframe_divisor) > 5000 ? 5000 : int(i_m2Macd_signalLength / timeframe_divisor)

m2Macd_fastMA       = ta.ema(m2_US_EU_CN, i_m2Macd_fastLength)
m2Macd_slowMA       = ta.ema(m2_US_EU_CN, i_m2Macd_slowLength)
m2Macd_line     = m2Macd_fastMA - m2Macd_slowMA
m2Macd_signalLine   = ta.ema(m2Macd_line, i_m2Macd_signalLength)

isM2MacdShortCrossBearish = ta.crossunder(m2Macd_line[i_m2LeadingIndicator_shortOffset], m2Macd_signalLine[i_m2LeadingIndicator_shortOffset])
m2Macd_shortOffsetDifference = m2Macd_line[i_m2LeadingIndicator_shortOffset] - m2Macd_signalLine[i_m2LeadingIndicator_shortOffset]
isM2MacdLongCrossBearish = ta.crossunder(m2Macd_line[i_m2LeadingIndicator_longOffset], m2Macd_signalLine[i_m2LeadingIndicator_longOffset])
//}

//{ RSI Divergence }
rsid_label = "RSI Divergence"
i_enable_timeframe_adjustment_rsi = input.bool(true, title="Apply Time Frame adjustment, ", group=rsid_label, display=display.none, inline="rsid_adj")
i_timeframe_adjustment_weight = input.float(1.0, title="w/ weight", minval=0.1, step=0.1, group=rsid_label, display=display.none, inline="rsid_adj")
i_rsid_src            = input(close, title="RSID Source", group=rsid_label, display=display.none)
i_rsid_lookback       = input.int(14, title="Look-back",  minval=1, step=1,group=rsid_label, display=display.none)
i_rsid_overbought     = input.int(70, title="i_rsid_overbought", minval=1, step=1, group=rsid_label, display=display.none)
i_rsid_oversold       = input.int(30, title="i_rsid_oversold", minval=1, step=1, group=rsid_label, display=display.none)
i_rsid_minBars        = input.int(5, "Min Bars Between Peaks", minval=1, step=1, group=rsid_label, display=display.none)
i_rsid_maxBars        = input.int(50, "Max Bars Between Peaks", minval=1, step=1, group=rsid_label, display=display.none)
i_rsid_res            = input.timeframe("", title="Oscillator resolution", group=rsid_label, display=display.none)
i_realTime_lookbackPeriod = input.int(20, "Lookback Period for Real-Time Div", minval=1, step=1, group=rsid_label, display=display.none)
i_rsid_len            = input.int(14, minval=1, title="Length", group=rsid_label, display=display.none)
i_rsid_bbLength       = input.int(20, "Bollinger Length", minval=1, step=1, group=rsid_label, display=display.none)
i_rsid_bbMultiplier   = input.float(2.0, "Bollinger Multiplier", minval=0.1, step=0.1, group=rsid_label, display=display.none)

if i_enable_timeframe_adjustment and i_enable_timeframe_adjustment_rsi
    i_rsid_lookback := int(i_rsid_lookback * i_timeframe_adjustment_weight / timeframe_divisor) > 5000 ? 5000 : int(i_rsid_lookback * i_timeframe_adjustment_weight / timeframe_divisor)
    i_realTime_lookbackPeriod := int(i_realTime_lookbackPeriod  * i_timeframe_adjustment_weight / timeframe_divisor) > 5000 ? 5000 : int(i_realTime_lookbackPeriod  * i_timeframe_adjustment_weight / timeframe_divisor)
    i_rsid_len  := int(i_rsid_len  * i_timeframe_adjustment_weight / timeframe_divisor) > 5000 ? 5000 : int(i_rsid_len  * i_timeframe_adjustment_weight / timeframe_divisor)
    i_rsid_bbLength := int(i_rsid_bbLength * i_timeframe_adjustment_weight / timeframe_divisor) > 5000 ? 5000 : int(i_rsid_bbLength * i_timeframe_adjustment_weight / timeframe_divisor)

rsid_lenUp            = ta.ema(math.max(ta.change(i_rsid_src), 0), i_rsid_len)
rsid_lenDn            = ta.ema(-math.min(ta.change(i_rsid_src), 0), i_rsid_len)
rsi = rsid_lenDn == 0 ? 100 : rsid_lenUp == 0 ? 0 : 100 - (100 / (1 + rsid_lenUp / rsid_lenDn))
rsid_osc = request.security(syminfo.tickerid, i_rsid_res, rsi)

rsid_phFound = rsiDiv.phFound(rsid_osc, i_rsid_lookback, i_rsid_lookback)
rsid_overbought = rsid_osc > i_rsid_overbought

_rsiRegularBearVal = rsiDiv.regularBearish(rsid_osc, high, 0, 5, 100, rsid_phFound)
rsiRegularBearCondition      = i_enable_longExitCondition_rsiRegularBearishDivergence and _rsiRegularBearVal
_rsiSlowingBearishVal = rsiDiv.slowingBearish(rsid_osc, i_rsid_overbought)
rsiSlowingBearishCondition   = rsid_overbought[1] and i_enable_longExitCondition_rsiSlowingBearishDivergence and _rsiSlowingBearishVal
_rsiDelayedBearishVal = rsiDiv.delayedPeakRSI(rsid_osc, i_rsid_overbought, 0)
rsiDelayedBearishCondition   = rsid_overbought[1] and i_enable_longExitCondition_rsiDelayedPeakDivergence and _rsiDelayedBearishVal
_rsiHiddenBearishVal = rsiDiv.hiddenBearish(rsid_osc, high, 0, 5, 100, rsid_phFound)
rsiHiddenBearishCondition    = i_enable_longExitCondition_rsiHiddenBearishDivergence and _rsiHiddenBearishVal
rsiRealTimeBearishCondition  = rsiDiv.realTimeBearishDiv(rsid_osc, high, i_realTime_lookbackPeriod, i_rsid_overbought)
//}

//{ Stoch and RSI range filter on Long entry}
groupStochAndRSI               = "Stoch and RSI range filter Long Entry"
rsi_highpass_filter            = input.int(60, "RSI Threshold for High(60)", minval=1, group=groupStochAndRSI, display=display.none)
stochvalue_highpass_filter     = input.int(70, "Stoch Value Threshold for High(?)", minval=1, group=groupStochAndRSI, display=display.none)

rsi_high_range_cond = rsid_osc > rsi_highpass_filter
stoch_high_range_cond = stoch_value > stochvalue_highpass_filter
//}

//{ Realized Price & Divergence}
groupRealizedPrice = "Realized Price"
realizedPriceSettings = libRealizedPrice.RealizedPriceSettings.new()
realizedPriceSettings.realizedPriceComparisonSource := input(title="Source for price to compare to(close)",defval=close, display=display.none, group=groupRealizedPrice)
realizedPriceSettings.smoothingLength := input.int(2, title="Smoothing Length(10)", minval=1, display=display.none, group=groupRealizedPrice)
realizedPriceSettings.smoothingMA := input.string("Simple Moving Average", "Smoothing MA Type", options=["Simple Moving Average", "Exponential Moving Average", "Weighted Moving Average", "Hull Moving Average", "Volume Weighted Moving Average", "Volume Weighted Average Price", "None"], group=groupRealizedPrice, display=display.none)
realizedPriceSettings.realizedPriceLength := input.int(5, title="Realized Price Length(80)", minval=1, display=display.none, group=groupRealizedPrice)
realizedPriceSettings.pivotLeft := input.int(5, title="Divergence Pivot Left(15)", minval=1, display=display.none, group=groupRealizedPrice)
realizedPriceSettings.pivotRight := input.int(1, title="Divergence Pivot Right(5)", minval=1, display=display.none, group=groupRealizedPrice)
realizedPriceSettings.gaussianLen := input.int(15, title="Gaussian Bands Length(50)", group=groupRealizedPrice, display=display.none)
realizedPriceSettings.gaussianMult := input.float(0.65, title="Gaussian Bands StdDev Mult(2)", group=groupRealizedPrice, display=display.none)
realizedPriceSettings.bullNuplThreshold := input.float(0, title="Filter for Bull NUPL Threshold(0)", display=display.none, group=groupRealizedPrice)
realizedPriceSettings.bearNuplThreshold := input.float(2.0, title="Filter for Bear NUPL Threshold(2.0)", display=display.none, group=groupRealizedPrice)

if i_enable_timeframe_adjustment
    realizedPriceSettings.smoothingLength := int(realizedPriceSettings.smoothingLength  / timeframe_divisor) > 5000 ? 5000 : int(realizedPriceSettings.smoothingLength  / timeframe_divisor)
    realizedPriceSettings.pivotLeft       := int(realizedPriceSettings.pivotLeft / timeframe_divisor) > 5000 ? 5000 : int(realizedPriceSettings.pivotLeft / timeframe_divisor)
    realizedPriceSettings.gaussianLen     := int(realizedPriceSettings.gaussianLen / timeframe_divisor) > 5000 ? 5000 : int(realizedPriceSettings.gaussianLen / timeframe_divisor)

[realized_price_bull_div, realized_price_bear_div, realized_price_bull_cond, realized_price_bear_cond, filtered_realized_price_bull_cond, filtered_realized_price_bear_cond, realized_price_smoothed_nupl, realized_price_gaussian_upper, realized_price_nupl] = libRealizedPrice.f_calc(realizedPriceSettings)
//}

//{ Volatility Directional Exit Parameters}
groupVolatility = "Volatility"
longVolatilityExitThreshold     = input.float(30, "Long Exit Volatility Threshold", tooltip="Negative volatility threshold to force exit of long positions", group=groupVolatility, display=display.none)
volatilityDirectionLength       = input.int(14, title="Length for std dev of directed volatility", group=groupVolatility, display=display.none)

if i_enable_timeframe_adjustment
    volatilityDirectionLength := int(volatilityDirectionLength / timeframe_divisor) > 5000 ? 5000 : int(volatilityDirectionLength / timeframe_divisor)

volatilityDirection = ta.change(close)
directedVolatility  = ta.stdev(volatilityDirection, volatilityDirectionLength)
longExitVolatilityCondition     = directedVolatility < longVolatilityExitThreshold
//}

//{ Short Entry Condition }
stochMasterSwitch   = input.string("Enabled", title="Stochastic RSI Master Switch", options=["Enabled","Disabled"], group= "Stochastic RSI Settings", display=display.none)
stoch_high_limit    = input.int(87, title="Stochastic High Limit", group= "Stochastic RSI Settings", display=display.none)
stoch_low_limit     = input.int(20, title="Stochastic Low Limit", group= "Stochastic RSI Settings", display=display.none)
stochCondition = stochMasterSwitch == "Enabled" ? (stoch_value > stoch_high_limit or stoch_value < stoch_low_limit) : true
shortCondition = timeCondition and (stochCondition or macd_flipped_bearish) and (m3_growth_rate_smoothed > m3ShortEntryThreshold or macd_flipped_bearish) and (m3_growthRateTrend < m3_growthRateTrendShortEntryThreshold) and (m3_growthRateTrend2 < m3_growthRateTrend2ShortEntryThreshold) and (macd_prediction < 0) and (m3_growthRateTrend + m3_growthRateTrend2 < m3_growthRateTrendsShortEntrySummedThreshold)
//}

atr1_dividedby_close = ta.atr(1) / close

// =====================================================================================================================
// LIBRARY CALL
// =====================================================================================================================
[finalExitCondition, longExitCondition_disabled_fired, longExitConditionName, longExitConditions] = libLongExit.f_calculateLongExit(close, timeCondition, i_longStopLossSrc, longStopPrice, hband, isM2SmoothedShortOffsetRising, m2_shortOffsetDiffToNbarsOut, m2_tinyOffsetDiffToNbarsOut, rocHMALongExit, rocHMALongExitThreshold, rocLongExitCondition, longExitVolatilityCondition, rsiRegularBearCondition, isM2SmoothedMediumOffsetFalling, m2_mediumOffsetDiffTo12barsOut, rsiHiddenBearishCondition, stoch_bearishDivergence, rsiSlowingBearishCondition, isM2SmoothedTinyOffsetRising, m2_smoothedTinyOffsetSlope, rsiRealTimeBearishCondition, rsi_high_range_cond, stoch_high_range_cond, m2_smoothedShortOffsetSlope_diff, realized_price_smoothed_nupl, rsiDelayedBearishCondition, macd_flipped_bearish, macd_prediction, macd, signal, shortCondition, macdLongExitCondition, isM2MacdShortCrossBearish, isM2MacdLongCrossBearish, isM2SmoothedShortOffsetFalling, macd_is_decreasing, isM2SmoothedLongOffsetFalling, stoch_value, rsid_osc, i_longExitCondition_stoch_over_N_threshold, i_longExitCondition_rsi_over_N_threshold, i_enable_stochastic_divergence_isFalling_rsid_threshold, isM2SmoothedMediumOffsetFlat, m2_smoothedShortOffsetSlope, m2Macd_shortOffsetDifference, atr1_dividedby_close, realized_price_bear_cond, realized_price_bear_div, realized_price_nupl, filtered_realized_price_bear_cond, isFalling_smoothedM3_no_offset, isM2SmoothedMiniOffsetRising, m2_smoothedTinyOffsetSlope_diff, i_enable_longExitCondition_crossUnderCloseHband, i_enable_longExitCondition_rocHMALongExitUnderThreshold, i_enable_longExitCondition_rocLongExitCondition, i_enable_longExitCondition_volatilityCondition, i_enable_longExitCondition_rsiRegularBearishDivergence, i_enable_longExitCondition_rsiHiddenBearishDivergence, i_enable_longExitCondition_rsiSlowingBearishDivergence, i_enable_longExitCondition_rsiRealTimeBearishDivergence, i_enable_longExitCondition_rsiRealTimeBearishVWAPDivergenceA, i_enable_longExitCondition_rsiRealTimeBearishVWAPDivergenceB, i_enable_longExitCondition_stochbearish_negative_diffs, i_longStopLossEnabled, i_enable_longExitCondition_macd_crossUnderPrediction, i_enable_longExitCondition_shortEntryCondition, i_enable_longExitCondition_macd_crossUnder, i_enable_longExitCondition_stochastic_divergence, i_enable_longExitCondition_stochbearish_vwap_bearish_macd_hist_rising, i_enable_longExitCondition_stochbearish_vwap_bearish_macd_flipped_bearish, i_enable_longExitCondition_isM2MacdLongCrossBearish, i_enable_longExitCondition_isM2MacdShortCrossBearish, i_enable_longExitCondition_m2_diff_less_than, i_enable_longExitCondition_stochbearish_stoch_over_N, i_enable_longExitCondition_stochastic_divergence_isFalling, i_enable_longExitCondition_isFalling_short_high_rsi_high_stoch, i_enable_longExitCondition_m2Macd_shortOffsetDifference_under_0, i_enable_longExitCondition_up_spike_when_isM2SmoothedTinyOffsetFlat, i_enable_longExitCondition_realized_price_bear_cond, i_enable_longExitCondition_realized_price_bear_div, i_enable_longExitCondition_realized_price_bear_div_tiny, i_enable_longExitCondition_filtered_realized_price_bear_cond, i_enable_longExitCondition_realized_price_crossUnderUpper, i_enable_longExitCondition_isFalling_smoothedM3_no_offset, i_enable_longExitCondition_rsiDelayedPeakDivergence, vwap_bearishDivergence, isMacdMinusMacdOneRising, realized_price_gaussian_upper, isM2SmoothedTinyOffsetFalling, isM2SmoothedLongOffsetRising, isM2SmoothedShortOffsetFlat, isM2SmoothedMediumOffsetRising)

// =====================================================================================================================
// PLOTTING LOGIC
// =====================================================================================================================
plot(longExitConditions.crossUnderCloseHband ? i_plot_baseline - i_plot_increment * 2 : na, title="crossUnderCloseHband", style=plot.style_linebr, color=color.new(color.fuchsia, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.rocHMALongExitUnderThreshold ? i_plot_baseline - i_plot_increment * 3 : na, title="rocHMALongExitUnderThreshold", style=plot.style_linebr, color=color.new(color.lime, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.rocLongExitCondition ? i_plot_baseline - i_plot_increment * 4 : na, title="rocLongExitCondition", style=plot.style_linebr, color=color.new(color.orange, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.volatilityCondition ? i_plot_baseline - i_plot_increment * 5 : na, title="volatilityCondition", style=plot.style_linebr, color=color.new(color.teal, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.rsiRegularBearCondition ? i_plot_baseline - i_plot_increment * 6 : na, title="rsiRegularBearCondition", style=plot.style_linebr, color=color.new(color.yellow, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.rsiHiddenBearCondition ? i_plot_baseline - i_plot_increment * 7 : na, title="rsiHiddenBearCondition", style=plot.style_linebr, color=color.new(color.blue, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.rsiSlowingBearCondition ? i_plot_baseline - i_plot_increment * 8 : na, title="rsiSlowingBearCondition", style=plot.style_linebr, color=color.new(color.maroon, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.realTimeBearCondition ? i_plot_baseline - i_plot_increment * 9 : na, title="realTimeBearCondition", style=plot.style_linebr, color=color.new(color.navy, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.realTimeBearVWAPConditionA ? i_plot_baseline - i_plot_increment * 10 : na, title="realTimeBearVWAPConditionA", style=plot.style_linebr, color=color.new(color.purple, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.realTimeBearVWAPConditionB ? i_plot_baseline - i_plot_increment * 11 : na, title="realTimeBearVWAPConditionB", style=plot.style_linebr, color=color.new(color.red, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.stochbearish_negative_diffs ? i_plot_baseline - i_plot_increment * 12 : na, title="stochbearish_negative_diffs", style=plot.style_linebr, color=color.new(color.green, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.delayedPeakBearCondition ? i_plot_baseline - i_plot_increment * 13 : na, title="delayedPeakBearCondition", style=plot.style_linebr, color=color.new(color.silver, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.macd_crossUnderPrediction ? i_plot_baseline - i_plot_increment * 14 : na, title="macd_crossUnderPrediction", style=plot.style_linebr, color=color.new(color.olive, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.shortEntryCondition ? i_plot_baseline - i_plot_increment * 15 : na, title="shortEntryCondition", style=plot.style_linebr, color=color.new(color.gray, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.macd_crossUnder ? i_plot_baseline - i_plot_increment * 16 : na, title="macd_crossUnder", style=plot.style_linebr, color=color.new(color.white, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.stochbearish_vwap_bearish_macd_hist_rising ? i_plot_baseline - i_plot_increment * 18 : na, title="stochbearish_vwap_bearish_macd_hist_rising", style=plot.style_linebr, color=color.new(color.fuchsia, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.stochbearish_vwap_bearish_macd_flipped_bearish ? i_plot_baseline - i_plot_increment * 19 : na, title="stochbearish_vwap_bearish_macd_flipped_bearish", style=plot.style_linebr, color=color.new(color.lime, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.isM2MacdShortCrossBearish ? i_plot_baseline - i_plot_increment * 20 : na, title="isM2MacdShortCrossBearish", style=plot.style_linebr, color=color.new(color.orange, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.isM2MacdLongCrossBearish ? i_plot_baseline - i_plot_increment * 21 : na, title="isM2MacdLongCrossBearish", style=plot.style_linebr, color=color.new(color.teal, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.stochastic_divergence_isFalling ? i_plot_baseline - i_plot_increment * 24 : na, title="stochastic_divergence_isFalling", style=plot.style_linebr, color=color.new(color.maroon, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.isFalling_short_high_rsi_high_stoch ? i_plot_baseline - i_plot_increment * 25 : na, title="isFalling_short_high_rsi_high_stoch", style=plot.style_linebr, color=color.new(color.navy, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.m2Macd_shortOffsetDifference_under_0 ? i_plot_baseline - i_plot_increment * 26 : na, title="m2Macd_shortOffsetDifference_under_0", style=plot.style_linebr, color=color.new(color.purple, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.up_spike_when_isM2SmoothedTinyOffsetFlat ? i_plot_baseline - i_plot_increment * 27 : na, title="up_spike_when_isM2SmoothedTinyOffsetFlat", style=plot.style_linebr, color=color.new(color.red, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.realized_price_bear_cond ? i_plot_baseline - i_plot_increment * 28 : na, title="realized_price_bear_cond", style=plot.style_linebr, color=color.new(color.green, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.realized_price_bear_div ? i_plot_baseline - i_plot_increment * 29 : na, title="realized_price_bear_div", style=plot.style_linebr, color=color.new(color.silver, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.realized_price_bear_div_tiny ? i_plot_baseline - i_plot_increment * 30 : na, title="realized_price_bear_div_tiny", style=plot.style_linebr, color=color.new(color.olive, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.filtered_realized_price_bear_cond ? i_plot_baseline - i_plot_increment * 31 : na, title="filtered_realized_price_bear_cond", style=plot.style_linebr, color=color.new(color.gray, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.realized_price_crossUnderUpper ? i_plot_baseline - i_plot_increment * 32 : na, title="realized_price_crossUnderUpper", style=plot.style_linebr, color=color.new(color.white, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
plot(longExitConditions.isFalling_smoothedM3_no_offset ? i_plot_baseline - i_plot_increment * 33 : na, title="isFalling_smoothedM3_no_offset", style=plot.style_linebr, color=color.new(color.aqua, 0), linewidth=i_plot_line_width, display=display.all-display.status_line)
