트렌드 헌터 w/MF 멀티 타임프레임 트렌드 전략은 여러 시간 프레임에 걸쳐 여러 기술적 지표의 포괄적인 분석을 기반으로 한 트렌드 추적 전략이다. 이 전략은 이치모쿠 클라우드, 이동 평균, 슈퍼 트렌드, 웨브 트렌드 및 머니 플로우와 같은 요인을 고려하여 엄격한 조건을 사용하여 입점 지점을 결정하고 시장의 주요 트렌드를 포착합니다.
이 전략의 핵심 원칙은 여러 시간 프레임에 걸쳐 여러 기술적 지표의 포괄적 인 분석입니다. 구체적으로:
이치모쿠 클라우드: 가격과 클라우드의 상대적 위치, 그리고 이동 평균과 클라우드의 상대적 위치를 분석하여 현재 시장 추세를 결정합니다. 가격이 클라우드 위에 있고 이동 평균도 클라우드 위에있을 때 상승 추세로 간주됩니다. 그렇지 않으면 하락 추세로 간주됩니다.
슈퍼 트렌드: 가격과 슈퍼 트렌드의 상대적 위치를 분석하여 현재 시장 추세를 확인합니다. 가격이 슈퍼 트렌드 이상의 경우 상승 추세로 간주됩니다. 그렇지 않으면 하락 추세로 간주됩니다.
웨이브 트렌드: 웨이브 트렌드 지표의 방향과 위치를 분석하여 현재 시장 추세를 결정합니다. 웨이브 트렌드가 상승하고 과잉 구매 구역에 도달하지 않은 경우 상승 추세로 간주됩니다. 웨이브 트렌드가 하락하고 과잉 판매 구역에 도달하지 않은 경우 하락 추세로 간주됩니다.
돈 흐름: 돈 흐름 지표의 상태를 분석함으로써 현재 시장 추세가 확인됩니다. 돈 흐름이 긍정적 인 경우 상승 추세로 간주됩니다. 그렇지 않으면 하락 추세로 간주됩니다.
긴 포지션의 경우, 전략은 가격이 클라우드 위에, 이동 평균이 클라우드 위에, 슈퍼 트렌드가 상승하고, 웨이브 트렌드가 상승하고 과잉 매입 구역에 있지 않고, 머니 플로우가 긍정적 인 것을 요구합니다. 짧은 포지션에는 그 반대가 적용됩니다. 여러 시간 프레임에 걸쳐 여러 지표에 기반한 이러한 엄격한 필터링은 범위 제한 시장에서 빈번한 거래를 효과적으로 피할 수 있으므로 전략의 안정성과 신뢰성을 향상시킵니다.
다중 지표에 기초한 포괄적 판단, 높은 신뢰성: 이 전략은 다양한 기술 지표를 포괄적으로 고려하여 서로 다른 시장 조건에서 상호 보완하여 시장 동향을 포괄적으로 반영하고 단일 지표에서 발생할 수있는 오류를 피합니다.
엄격한 입시 조건, 빈번한 거래를 피합니다. 전략은 엄격한 입시 조건을 설정하여 지점에 진입하기 전에 여러 지표가 동시에 충족되어야합니다. 이는 범위 제한 시장에서 빈번한 거래를 효과적으로 피하고 전략의 마취를 줄입니다.
멀티 타임프레임 분석, 큰 트렌드를 파악: 전략은 여러 시간 프레임에 걸쳐 분석을 수행하여 전략이 시장의 주요 트렌드를 더 넓은 관점에서 파악하는 데 도움이됩니다. 단기 소음의 간섭을 피합니다.
명확한 스톱 로스 전략, 통제 가능한 위험: 전략은 스퍼 트렌드를 스톱 로스 조건으로 사용합니다. 시장 트렌드가 변경되면 전략은 적시에 손실을 중지하여 손실을 수용 가능한 범위 내에서 유지할 수 있습니다.
동적 조정 부족, 시장 변화에 대응할 수있는 능력 제한: 이 전략의 매개 변수 설정은 고정되어 있으며 시장 조건에 따라 동적으로 조정 할 수있는 능력이 없습니다. 시장 조건이 크게 변하면 전략이 실패 할 수 있습니다.
지나치게 엄격한 진입 조건은 좋은 기회를 놓칠 수 있습니다. 전략의 진입 조건은 매우 엄격합니다. 이는 빈번한 거래를 피할 수 있지만 전략이 좋은 진입 기회를 놓칠 수도 있습니다.
극심한 시장 조건에 대한 적응력은 알려져 있지 않습니다. 전략은 정상적인 시장 조건에서 잘 수행되지만 신속하고 실질적인 반전과 같은 일부 극심한 시장 조건에 대한 적응력은 아직 테스트되지 않았습니다.
비교적 간단한 스톱 로스 전략, 최적화 가능: 현재 전략은 스퍼트렌드를 스톱 로스 조건으로만 사용합니다. 간단하고 직설적이지만, 위험을 더 잘 제어하기 위해 스톱 로스 전략에서 더 많은 최적화 가능성은 있습니다.
시장 조건 판단을 도입하고 매개 변수를 동적으로 조정합니다. 변동성 지표와 같은 일부 시장 상태 판단 지표를 도입하여 다른 시장 환경에 적응하기 위해 시장 조건 변화에 따라 전략 매개 변수를 동적으로 조정하는 것을 고려하십시오.
진입 조건을 최적화하고 감수성을 향상시킵니다. 더 많은 확인 지표를 도입하는 것과 같은 진입 조건을 최적화하는 것을 고려하여 신뢰성을 보장하면서 전략의 감수성을 향상시키고 더 많은 거래 기회를 포착하십시오.
극단적인 시장 조건에 대한 대응 조치를 추가하십시오: 급속하고 실질적인 반전과 같은 일부 극단적인 시장 조건에 대해 극단적인 시장 조건에서 전략의 위험을 줄이기 위해 중단 손실의 강도를 증가하거나 거래를 중단하는 것과 같은 특별한 대응 조치를 도입하는 것을 고려하십시오.
스톱 로스 전략을 최적화하고 리스크 제어 능력을 향상시킵니다. 시간 스톱 로스, 범위 스톱 로스 등 더 많은 스톱 로스 조건을 도입하는 것을 고려하십시오. 또한 리스크를 더 잘 제어하기 위해 후속 스톱 로스와 같은 동적 스톱 로스 전략을 도입하는 것을 고려하십시오.
트렌드 헌터 w/MF 멀티 타임프레임 트렌드 전략은 멀티 지표, 멀티 타임프레임 분석에 기반한 트렌드 추적 전략이다. 이 전략은 이치모쿠 클라우드, 이동 평균, 슈퍼 트렌드, 웨이브 트렌드 및 머니플로우와 같은 요인을 종합적으로 고려하고 엄격한 입시 조건 설정 및 멀티 타임프레임 분석을 통해 시장의 주요 트렌드를 비교적 안정적으로 파악할 수 있으며, 범위 제한 시장에서 빈번한 거래를 피하고 안정성과 신뢰성을 갖추고 있습니다.
동시에, 이 전략은 또한 동적 조정 능력의 부족, 잠재적으로 지나치게 엄격한 입시 조건, 극단적인 시장 조건에 대한 알 수 없는 적응력 및 비교적 간단한 스톱 로스 전략과 같은 일부 제한과 위험을 가지고 있습니다. 이 모든 분야는 이 전략이 미래에 최적화되고 개선 될 수 있습니다.
전체적으로 트렌드 헌터 w/MF 멀티 타임프레임 트렌드 전략은 좋은 잠재력을 가진 트렌드 추후 전략이다. 이 전략을 사용할 때, 거래자는 그 원칙, 장점 및 위험을 완전히 이해하고 자신의 위험 선호도 및 거래 스타일에 따라 필요한 조정 및 최적화를 수행해야합니다. 동시에 시장 조건의 변화를 면밀히 모니터링하고 시장 변화에 적응하기 위해 전략을 적시에 조정해야합니다. 깊이 있는 이해와 신중한 사용의 기초에서만이 전략이 잠재적인 장점을 완전히 발휘하고 거래자에게 안정적인 수익을 가져올 수 있습니다.
/*backtest start: 2024-02-01 00:00:00 end: 2024-02-29 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © godzcopilot / blockybears // Thanks to anthonyf50 for his MTF Ichimoku https://www.tradingview.com/script/Pw9cBFma/ // Thanks to KivancOzbilgic for his SuperTrend https://www.tradingview.com/script/r6dAP7yi/ // Thanks to ZenAndTheArtOfTrading / PineScriptMastery for their Higher Timeframe EMA https://www.tradingview.com/script/Vh3XG9sD-Higher-Timeframe-EMA/ // Thanks to LazyBear for WaveTrend Oscillator https://www.tradingview.com/script/2KE8wTuF-Indicator-WaveTrend-Oscillator-WT/ // Thanks to andreholanda73 for MFI+RSI Area https://www.tradingview.com/script/UlGZzUAr/ //@version=5 strategy("TrendHunter w/MF [Blocky]", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=80, initial_capital=1000, pyramiding=0) // ================ // Strategy Inputs // ================ // Defines user inputs for configuring the strategy. // Inputs for EMA len = input.int(title="EMA Length", defval=200, group ='== EMA ==') col = input.bool(title="Colour EMA", defval=true, group ='== EMA ==') // SuperTrend Periods = input(title='ATR: Period', defval=10, group = '== Supertrend ==', inline = 'atr') Multiplier = input.float(title='Mult', step=0.1, defval=3.0, group = '== Supertrend ==', inline = 'atr') Src = input.source(title='Src', defval=hl2, group = '== Supertrend ==', inline = 'atr') // Ichimoku conversionPeriods = input.int(9, minval=1, title='Conversion', group = '== Ichimoku ==', inline = 'ich1') basePeriods = input.int(26, minval=1, title='Base', group = '== Ichimoku ==', inline = 'ich1') laggingSpan2Periods = input.int(52, minval=1, title='Lagging', group = '== Ichimoku ==', inline = 'ich2') displacement = input.int(26, minval=1, title='Displacement', group = '== Ichimoku ==', inline = 'ich2') // Ichimoku Display Options isActiveConversion = input(false, 'Conversion', group = '== Ichimoku ==', inline = 'lines1') isActiveBase = input(false, 'Base', group = '== Ichimoku ==', inline = 'lines1') isActiveLagging = input(false, 'Lagging', group = '== Ichimoku ==', inline = 'lines1') isActiveCloud = input(true, 'Cloud', group = '== Ichimoku ==', inline = 'lines1') // Input for WaveTrend n1 = input(9, 'Channel Length', group = '== WaveTrend ==', inline = 'wt1') n2 = input(12, 'Average Length', group = '== WaveTrend ==', inline = 'wt1') obLevel = input(60, 'Over Bought', group = '== WaveTrend ==', inline = 'wt2') osLevel = input(-60, 'Over Sold', group = '== WaveTrend ==', inline = 'wt2') // Input for Money Flow rsiMFIperiod = input(60, 'Money Flow Length', group = '== Money Flow ==', inline = 'mf') rsiMFIMultiplier = input(190, 'RSI+MFI Area multiplier', group = '== Money Flow ==', inline = 'mf') MFRSIMA = input.string(defval='SMA', title='Money Flow MA Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'VWMA'], group = '== Money Flow ==', inline = 'mf') // ================ // Strategy Options // ================ bTable = input.bool(false, title='Trade Table', group='== Strategy Options ==', tooltip = "Show table that shows current selected options and trade trade entry parameters") bLong = input.bool(true, title='Enter Longs', group='== Strategy Options ==', inline = 'LongShort') bShort = input.bool(true, title='Enter Shorts', group='== Strategy Options ==', inline = 'LongShort', tooltip = "Filter long / short trade signals") bPriceCloud = input.bool(true, title='Price outside cloud', group='== Strategy Options ==', inline='PriceCloud') priceActionOption = input.string(title="", defval="Close", options=["Close", "Candle Body", "Full Candle"], group = "== Strategy Options ==", inline='PriceCloud') bPriceEMA = input.bool(false, title='Price above/below EMA', group='== Strategy Options ==', inline='PriceEMA') priceEMAOption = input.string(title="", defval="Close", options=["Close", "Candle Body", "Full Candle"], group = "== Strategy Options ==", inline='PriceEMA') bSuper = input.bool(true, title='Supertrend transistions', group='== Strategy Options ==', tooltip = "Trade in direction of the supertrend transitions") bEMACloud1 = input.bool(true, title='EMA Outside Cloud', group='== Strategy Options ==', tooltip = "EMA must be outside the ichimoku cloud") bEMACloud2 = input.bool(false, title='EMA above/below Cloud', group='== Strategy Options ==', tooltip = "Longs when EMA above the cloud.\nShort when EMA below the cloud") bMFI = input.bool(false, title='Money Flow', group='== Strategy Options ==', tooltip = "Money Flow Green for Long\nMoney Flow Red for Short") bWT = input.bool(false, title='Wavetrend', group='== Strategy Options ==', inline = 'WT') bWTOB = input.bool(false, title='Overbought/sold', group='== Strategy Options ==', tooltip = "Longs when WT Rising\nShort when WT Falling\n\nRestrict entries if in overbough or oversold levels",inline = 'WT') bExitHTFTrail = input.bool(true, title='Super Trend Exits', group='== Strategy Options ==', inline = 'Exits') // =========================== // EMA Functions and Plotting // =========================== // Calculate EMA ema = ta.ema(close, len) emaSmooth = request.security(syminfo.tickerid, "", ema[barstate.isrealtime ? 1 : 0], gaps=barmerge.gaps_on)[barstate.isrealtime ? 0 : 1] // Draw EMA plot(emaSmooth, color=col ? (close > emaSmooth ? color.rgb(76, 163, 175) : color.rgb(6, 23, 173)) : color.black, linewidth=2, title="HTF EMA") // ================================== // Supertrend Functions and Plotting // ================================== // Function to calculate SuperTrend calcSuperTrend(src, atrPeriods, multiplier) => atr = ta.atr(atrPeriods) up = src - multiplier * atr up1 = nz(up[1], up) up := close[1] > up1 ? math.max(up, up1) : up dn = src + multiplier * atr dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? math.min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend [up, dn, trend] // Fetching the higher time frame data [HTF_up, HTF_dn, HTF_trend] = request.security(syminfo.tickerid, "", calcSuperTrend(hl2, Periods, Multiplier), lookahead=barmerge.lookahead_on) // Plotting for the higher time frame plot(HTF_trend == 1 ? HTF_up : HTF_dn, title='HTF Up Trend', color= HTF_trend == 1 ? color.green : color.red, linewidth=4) // =============================== // Ichimoku Functions and Plotting // =============================== // Function to convert timeframe to hours f_convertTimeframeToHours(tf) => val = 0.0 if tf == "1S" or tf == "S" val := 1.0 / 3600.0 else if str.contains(tf, "S") val := str.tonumber(str.replace(tf, "S", "")) / 3600.0 else if tf == "1D" or tf == "D" val := 24.0 else if str.contains(tf, "D") val := str.tonumber(str.replace(tf, "D", "")) * 24.0 else if tf == "1W" or tf == "W" val := 24.0 * 7.0 else if str.contains(tf, "W") val := str.tonumber(str.replace(tf, "W", "")) * 24.0 * 7.0 else if tf == "1M" or tf == "M" val := 24.0 * 30.0 // Approximation for a month else if str.contains(tf, "M") val := str.tonumber(str.replace(tf, "M", "")) * 24.0 * 30.0 // Approximation for months else // Default to minutes val := str.tonumber(tf) / 60.0 val // Time timeOffset = time - time[1] // Returns the displacement based on the chart / HTF resolution f_getDisplacement(_res) => _res == '' ? displacement : math.round(f_convertTimeframeToHours(_res) / f_convertTimeframeToHours(timeframe.period) * displacement) //f_avgDilationOf(_res) * displacement // Returns average value between lowest and highest f_avgLH(_len) => math.avg(ta.lowest(_len), ta.highest(_len)) // Returns f_donchian data f_donchian(_tf, _src) => request.security(syminfo.tickerid, _tf, _src, barmerge.gaps_off, barmerge.lookahead_on) // Returns ichimoku data f_ichimokuData(_tf) => _isShow = _tf == '' or f_convertTimeframeToHours(_tf) >= f_convertTimeframeToHours(timeframe.period) _displacement = _isShow ? f_getDisplacement(_tf) : na _Conversion = _isShow ? f_donchian(_tf, f_avgLH(conversionPeriods)) : na _Base = _isShow ? f_donchian(_tf, f_avgLH(basePeriods)) : na _Lagging = _isShow ? f_donchian(_tf, close) : na _SSA = _isShow ? math.avg(_Conversion, _Base) : na _SSB = _isShow ? f_donchian(_tf, f_avgLH(laggingSpan2Periods)) : na _middleCloud = _isShow ? _SSA[0] > _SSB[0] ? _SSA[0] - math.abs(_SSA[0] - _SSB[0]) / 2 : _SSA[0] + math.abs(_SSA[0] - _SSB[0]) / 2 : na [_displacement, _Conversion, _Base, _Lagging, _SSA, _SSB, _middleCloud] // Plotting ichimoku data [Displacement, Conversion, Base, Lagging, SSA, SSB, fisrtMiddleCloud] = f_ichimokuData("") // ————— Conversion plot(isActiveConversion ? Conversion : na, color=color.new(color.blue, 0), title=' Conversion', linewidth=1) // ————— Base plot(isActiveBase ? Base : na, color=color.new(color.fuchsia, 0), title=' Base', linewidth=2) // ————— Lagging plot(isActiveLagging ? Lagging : na, offset=-Displacement, color=color.new(color.green, 0), title=' Lagging') // ————— SSA + SSB ssa = plot(isActiveCloud ? SSA : na, offset=Displacement, color=color.new(color.green, 0), title=' SSA', linewidth=1) ssb = plot(isActiveCloud ? SSB : na, offset=Displacement, color=color.new(color.red, 0), title=' SSB', linewidth=1) fill(ssa, ssb, color=color.new(SSA > SSB ? color.green : color.red , 80), title=' Cloud') // =============================== // Makret Cypher Additions // =============================== // WaveTrend calculations ap = hlc3 esa = ta.ema(ap, n1) d = ta.ema(math.abs(ap - esa), n1) ci = (ap - esa) / (0.015 * d) tci = ta.ema(ci, n2) wt1 = tci wt2 = ta.sma(wt1, 3) // WaveTrend plotting //plot(0, color=color.rgb(120, 123, 134), title='Zero Line') //plot(emaSmooth + wt1, color=color.rgb(191, 228, 255), style=plot.style_linebr, title='WaveTrend 1') //plot(emaSmooth + wt2, color=color.rgb(56, 56, 56, 40), style=plot.style_linebr, title='WaveTrend 2') // WaveTrend shapes plotshape(ta.crossover(wt1, wt2) and wt2[2] < osLevel ? close : na, title='Pos Crossover', location=location.belowbar, style=shape.cross, size=size.small, color=color.rgb(63, 255, 0, 60)) plotshape(ta.crossover(wt2, wt1) and wt1[2] > osLevel ? close : na, title='Neg Crossover', location=location.abovebar, style=shape.cross, size=size.small, color=color.rgb(255, 82, 82, 60)) plotshape(ta.crossover(wt1, wt2) and osLevel ? close : na, title='Positive Crossover', location=location.belowbar, style=shape.triangleup, size=size.tiny, color=color.rgb(63, 255, 0, 60)) plotshape(ta.crossover(wt2, wt1) and obLevel ? close : na, title='Negative Crossover', location=location.abovebar, style=shape.triangledown, size=size.tiny, color=color.rgb(255, 82, 82, 60)) // Function to determine WaveTrend direction and steepness isWaveTrendUp() => wt1Slope = wt1 - wt1[1] wt2Slope = wt2 - wt2[1] if wt1 > wt2 // wt1Slope > 0 and wt2Slope > 0 1 // Both are going up else if wt1 < wt2 // wt1Slope < 0 and wt2Slope < 0 2 // Both are going down else na // Trends are not in the same direction ma(matype, src, length) => if matype == 'RMA' ta.rma(src, length) else if matype == 'SMA' ta.sma(src, length) else if matype == 'EMA' ta.ema(src, length) else if matype == 'WMA' ta.wma(src, length) else if matype == 'VWMA' ta.vwma(src, length) else src // Money Flow calculations candleValue = (close - open) / (high - low) MVC = ma(MFRSIMA, candleValue, rsiMFIperiod) MVC := MVC * rsiMFIMultiplier mfi_transp = math.abs(MVC) > 35 ? 0 : math.abs(MVC) > 30 ? 20 : math.abs(MVC) > 25 ? 30 : math.abs(MVC) > 20 ? 40 : math.abs(MVC) > 15 ? 50 : math.abs(MVC) > 10 ? 60 : math.abs(MVC) > 5 ? 65 : math.abs(MVC) > 2 ? 70 : 80 color_area = MVC > 0 ? color.rgb(76, 255, 80, mfi_transp) : color.rgb(255, 82, 82, mfi_transp) // Money Flow plotting // RSIMFIplot = plot(MVC * rsiMFIMultiplier, title='Money Flow', color=color_area, style=plot.style_area) // fill(RSIMFIplot, plot(0), color_area) plotshape(MVC > 0 ? true : na, title='MFI', location=location.top, style=shape.labeldown, size= size.tiny, color=color_area) plotshape(MVC < 0 ? true : na, title='MFI', location=location.top, style= shape.labelup, size= size.tiny, color=color_area) // =============================== // Strategy Entries // =============================== // Checks whether price is inside the Ichimoku cloud f_PriceCloud(dir) => _enter = false if bPriceCloud if bLong and dir == 1 _enter := switch priceActionOption "Close" => close > math.max(SSA[Displacement], SSB[Displacement]) "Candle Body" => open > math.max(SSA[Displacement], SSB[Displacement]) and close > math.max(SSA[Displacement], SSB[Displacement]) "Full Candle" => low > math.max(SSA[Displacement], SSB[Displacement]) and high > math.max(SSA[Displacement], SSB[Displacement]) if bShort and dir == 2 _enter := switch priceActionOption "Close" => close < math.min(SSA[Displacement], SSB[Displacement]) "Candle Body" => open < math.min(SSA[Displacement], SSB[Displacement]) and close < math.min(SSA[Displacement], SSB[Displacement]) "Full Candle" => low < math.min(SSA[Displacement], SSB[Displacement]) and high < math.min(SSA[Displacement], SSB[Displacement]) else _enter := na _enter // Checks whether price is above / below the ema f_PriceEMA(dir) => _enter = false if bPriceEMA if bLong and dir == 1 _enter := switch priceEMAOption "Close" => close > math.max(SSA[Displacement], SSB[Displacement]) "Candle Body" => open > math.max(SSA[Displacement], SSB[Displacement]) and close > math.max(SSA[Displacement], SSB[Displacement]) "Full Candle" => low > math.max(SSA[Displacement], SSB[Displacement]) and high > math.max(SSA[Displacement], SSB[Displacement]) if bShort and dir == 2 _enter := switch priceEMAOption "Close" => close < math.min(SSA[Displacement], SSB[Displacement]) "Candle Body" => open < math.min(SSA[Displacement], SSB[Displacement]) and close < math.min(SSA[Displacement], SSB[Displacement]) "Full Candle" => low < math.min(SSA[Displacement], SSB[Displacement]) and high < math.min(SSA[Displacement], SSB[Displacement]) else _enter := na _enter // Checks HTF supertrend direction f_Super(dir) => _enter = false if bSuper if bLong and dir == 1 _enter := HTF_trend == 1 if bShort and dir == 2 _enter := HTF_trend == -1 else _enter := na _enter // Checks whether ema is inside the Ichimoku cloud f_EMACloud1(dir) => _enter = false if bEMACloud1 if bLong and dir == 1 _enter := (emaSmooth > math.max(SSA[Displacement], SSB[Displacement])) or (emaSmooth < math.min(SSA[Displacement], SSB[Displacement])) if bShort and dir == 2 _enter := (emaSmooth > math.max(SSA[Displacement], SSB[Displacement])) or (emaSmooth < math.min(SSA[Displacement], SSB[Displacement])) else _enter := na _enter // Checks whether ema is above/below Ichimoku cloud f_EMACloud2(dir) => _enter = false if bEMACloud2 if bLong and dir == 1 _enter := emaSmooth > math.max(SSA[Displacement], SSB[Displacement]) if bShort and dir == 2 _enter := emaSmooth < math.min(SSA[Displacement], SSB[Displacement]) else _enter := na _enter // Checks whether moneyflow is positive f_MFI(dir) => _enter = false if bMFI if bLong and dir == 1 _enter := MVC > 0 if bShort and dir == 2 _enter := MVC < 0 else _enter := na _enter // Checks whether wavetrend is rising or falling f_WT(dir) => _enter = false if bWT if bLong and dir == 1 _enter := isWaveTrendUp() == dir if bShort and dir == 2 _enter := isWaveTrendUp() == dir else _enter := na _enter f_WTOB(dir) => _enter = false if bWT and bWTOB if bLong and dir == 1 _enter := wt1 < obLevel if bShort and dir == 2 _enter := wt1 > osLevel else _enter := na _enter // Check if a value is 'na' or true. f_NATrue(val) => _enter = false if na(val) _enter := true if val _enter := true _enter // Consolidates entry conditions. f_checkCondition(dir) => _enter = false if na(f_PriceCloud(dir)) and na(f_PriceEMA(dir)) and na(f_Super(dir)) and na(f_EMACloud1(dir)) and na(f_EMACloud2(dir)) and na(f_MFI(dir)) and na(f_WT(dir)) and na(f_WTOB(dir)) _enter := false else if f_NATrue(f_PriceCloud(dir)) and f_NATrue(f_PriceEMA(dir)) and f_NATrue(f_Super(dir)) and f_NATrue(f_EMACloud1(dir)) and f_NATrue(f_EMACloud2(dir)) and f_NATrue(f_MFI(dir)) and f_NATrue(f_WT(dir)) and f_NATrue(f_WTOB(dir)) _enter := true _enter // Execute long trade entries longCondition = bLong and f_checkCondition(1) if (longCondition) strategy.entry("Long", strategy.long) // Execute short trade entries shortCondition = bShort and f_checkCondition(2) if (shortCondition) strategy.entry("Short", strategy.short) // Excute trade exits exitLong = (bExitHTFTrail and (close < HTF_up or HTF_trend == -1)) exitShort = (bExitHTFTrail and (close > HTF_dn or HTF_trend == 1)) if exitLong strategy.close("Long") if exitShort strategy.close("Short") // Creates a table shoing all the user options and their current status for entering a trade if bTable // Create a table tbl = table.new(position = position.bottom_right, columns = 4, rows = 11, bgcolor=color.new(color.black,100), border_width = 0, frame_width = 0) table.cell(tbl, 1, 0, "Selected", text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 0, "Long", bgcolor=na(bLong) ? color.new(color.black,100) : bShort ? color.rgb(4, 112, 8) : color.rgb(100, 7, 7), text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 0, "Short", bgcolor=na(bShort) ? color.new(color.black,100) : bShort ? color.rgb(4, 112, 8) : color.rgb(100, 7, 7), text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 1, "Entry", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 1, longCondition ? "✓" : "✗", bgcolor=longCondition ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 1, shortCondition ? "✓" : "✗", bgcolor=shortCondition ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 3, "Price Cloud", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 3, bPriceCloud ? "✓" : "✗", bgcolor=na(bPriceCloud) ? color.new(color.black,100) : bPriceCloud ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 3, f_PriceCloud(1) ? "✓" : "✗", bgcolor=na(f_PriceCloud(1)) ? color.new(color.black,100) : f_PriceCloud(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 3, f_PriceCloud(2) ? "✓" : "✗", bgcolor=na(f_PriceCloud(2)) ? color.new(color.black,100) : f_PriceCloud(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 4, "Price EMA", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 4, bPriceEMA ? "✓" : "✗", bgcolor=na(bPriceEMA) ? color.new(color.black,100) : bPriceEMA ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 4, f_PriceEMA(1) ? "✓" : "✗", bgcolor=na(f_PriceEMA(1)) ? color.new(color.black,100) : f_PriceEMA(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 4, f_PriceEMA(2) ? "✓" : "✗", bgcolor=na(f_PriceEMA(2)) ? color.new(color.black,100) : f_PriceEMA(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 5, "SuperTrend", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 5, bSuper ? "✓" : "✗", bgcolor=na(bSuper) ? color.new(color.black,100) : bSuper ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 5, f_Super(1) ? "✓" : "✗", bgcolor=na(f_Super(1)) ? color.new(color.black,100) : f_Super(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 5, f_Super(2) ? "✓" : "✗", bgcolor=na(f_Super(2)) ? color.new(color.black,100) : f_Super(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 6, "EMA Outside Cloud", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 6, bEMACloud1 ? "✓" : "✗", bgcolor=na(bEMACloud1) ? color.new(color.black,100) : bEMACloud1 ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 6, f_EMACloud1(1) ? "✓" : "✗", bgcolor=na(f_EMACloud1(1)) ? color.new(color.black,100) : f_EMACloud1(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 6, f_EMACloud1(2) ? "✓" : "✗", bgcolor=na(f_EMACloud1(2)) ? color.new(color.black,100) : f_EMACloud1(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 7, "EMA Above/Below Cloud", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 7, bEMACloud2 ? "✓" : "✗", bgcolor=na(bEMACloud2) ? color.new(color.black,100) : bEMACloud2 ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 7, f_EMACloud2(1) ? "✓" : "✗", bgcolor=na(f_EMACloud2(1)) ? color.new(color.black,100) : f_EMACloud2(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 7, f_EMACloud2(2) ? "✓" : "✗", bgcolor=na(f_EMACloud2(2)) ? color.new(color.black,100) : f_EMACloud2(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 8, "Moneyflow", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 8, bMFI ? "✓" : "✗", bgcolor=na(bMFI) ? color.new(color.black,100) : bMFI ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 8, f_MFI(1) ? "✓" : "✗", bgcolor=na(f_MFI(1)) ? color.new(color.black,100) : f_MFI(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 8, f_MFI(2) ? "✓" : "✗", bgcolor=na(f_MFI(2)) ? color.new(color.black,100) : f_MFI(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 9, "WaveTrend", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 9, bWT ? "✓" : "✗", bgcolor=na(bWT) ? color.new(color.black,100) : bWT ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 9, f_WT(1) ? "✓" : "✗", bgcolor=na(f_WT(1)) ? color.new(color.black,100) : f_WT(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 9, f_WT(2) ? "✓" : "✗", bgcolor=na(f_WT(2)) ? color.new(color.black,100) : f_WT(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 0, 10, "Overbought/Sold " + str.tostring(wt1, '#.#'), text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 1, 10, bWTOB ? "✓" : "✗", bgcolor=na(bWTOB) ? color.new(color.black,100) : bWTOB ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 2, 10, f_WTOB(1) ? "✓" : "✗", bgcolor=na(f_WTOB(1)) ? color.new(color.black,100) : f_WTOB(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207)) table.cell(tbl, 3, 10, f_WTOB(2) ? "✓" : "✗", bgcolor=na(f_WTOB(2)) ? color.new(color.black,100) : f_WTOB(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))