/////////////////////////////////////////////////////// // // SaherElm IT Center XTrade TMPLMCD5M Strategy // --------------------------------------------- // in this strategy i must use: // - Price Action Candle Recognition Indicator; // - Swing Stop Loss Indicator; // - TrenMagic Indicator; // - Impulse MACD Oscillator; // - Cycle Channel Oscillator; // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // //@version=5 indicator(title="SaherElm XTrade TMPLMCD5M Strategy", shorttitle = "XST_TMPLMCD5M", overlay = true) // // START Inputs .... // // // Determines Show Signals or not ... showSignals = input.bool(defval = true, title = "Show Signals", group = "Strategy") showStopLosses = input.bool(defval = true, title = "Show Stop Losses", group = "Strategy") // // Show Signals based on their types ... showLongSignals = input.bool(defval = true, title = "Show Long Signals", group = "Signals") showShortSignals = input.bool(defval = true, title = "Show Short Signals", group = "Signals") // // Show Stop Losses based on their types ... swingLoopback = input.int(defval = 7, title = "Swing Loopback Period", group = "Stop Loss") showLongStopLosses = input.bool(defval = true, title = "Show Long Stop Losses", group = "Stop Loss") showShortStopLosses = input.bool(defval = true, title = "Show Short Stop Losses", group = "Stop Loss") // // END Inputs .... // // // START Functions .... // ////////////////////////////// // START Price Action Candles ////////////////////////////// // // Retrieve Specific Candle Height (based on low and high) ... getCandleRange() => high - low // // Retrieve Candle Ranges Thirs Section ... getCandleThird() => getCandleRange() / 3 // // Determines a Candle is Bullish or not ... isBullishCandle() => close > low + (getCandleThird() * 2) // // Determines a Candle is Bearish or not ... isNeutralCandle() => close < low + (getCandleThird() * 2) and close > low + getCandleThird() // // Determines a Candle is Neutral or not ... isBearishCandle() => close < low + getCandleThird() ///////////////////////////// // END Price Action Candles ///////////////////////////// ////////////////////// // START Impuls MACD ////////////////////// // calc_smma(src, len) => float result = na rSma = ta.sma(src, len) result := na(result[1]) ? rSma : (result[1] * (len - 1) + src) / len result // calc_zlema(src, length) => ema1 = ta.ema(src, length) ema2 = ta.ema(ema1, length) d = ema1 - ema2 result = ema1+d result ////////////////////// // END Impuls MACD ////////////////////// // // END Functions .... // // // START Calculations .... // // var shortColor = color.fuchsia var longColor = color.aqua ////////////////////////////// // START Price Action Candles ////////////////////////////// // var bullishTitle = "Bullish" var bullishType = 1 // var bearishTitle = "Bearish" var bearishType = -1 // var neutralTitle = "Neutral" var neutralType = 0 // candleType = isBullishCandle() ? bullishType : isNeutralCandle() ? neutralType : isBearishCandle() ? bearishType : neutralType // prevCandleType = not na(candleType[1]) ? candleType[1] : neutralType // candleNeighborhoodBaseType = prevCandleType + candleType ///////////////////////////// // END Price Action Candles ///////////////////////////// //////////////////////////// // START Last Market Price //////////////////////////// // lastMarketLowest = ta.lowest(low, swingLoopback) lastMarketLowest2 = ta.lowest(low, swingLoopback * 2) lastMarketLowest3 = ta.lowest(low, swingLoopback * 3) // lastMarketHighest = ta.highest(high, swingLoopback) lastMarketHighest2 = ta.highest(high, swingLoopback * 2) lastMarketHighest3 = ta.highest(high, swingLoopback * 3) //////////////////////////// // END Last Market Price //////////////////////////// //////////////////////////// // START Trend Magic ... //////////////////////////// TMAP = 5 TMCoeff = 1 TMPeriod = 18 TMSrc = close // TMATR = ta.sma(ta.tr,TMAP) // TMUpT = low - TMATR * TMCoeff TMDownT = high + TMATR * TMCoeff // TMMagicTrend = 0.0 TMMagicTrend := ta.cci(TMSrc, TMPeriod) >= 0 ? (TMUpT < nz(TMMagicTrend[1]) ? nz(TMMagicTrend[1]) : TMUpT) : (TMDownT > nz(TMMagicTrend[1]) ? nz(TMMagicTrend[1]) : TMDownT) // // Check Candle State based on TMMagic Trend ... TMCandleState = ta.cci(TMSrc, TMPeriod) // TMTrendUp = TMCandleState > 0 TMTrendDown = TMCandleState < 0 TMTrendNeutral = TMCandleState == 0 // TMTrendDiff = TMMagicTrend - TMMagicTrend[1] // TMTrendChanged = (TMTrendUp and not TMTrendUp[1]) or (TMTrendDown and not TMTrendDown[1]) // TMColor = TMTrendUp ? color.green : TMTrendDown ? color.red : TMTrendNeutral ? color.gray : na //////////////////////////// // END Trend Magic ... //////////////////////////// /////////////////////// // START Cycle Channel /////////////////////// // CCHSclT = 10 CCHMclT = 30 CCHScm = 1.0 CCHMcm = 3.0 CCHSrc = close CCHEbc = false // CCHScl = CCHSclT / 2 CCHMcl = CCHMclT / 2 // CCHMaScl = ta.rma(CCHSrc, CCHScl) CCHMaMcl = ta.rma(CCHSrc, CCHMcl) // CCHScmOff = CCHScm * ta.atr(CCHScl) CCHMcmOff = CCHMcm * ta.atr(CCHMcl) // CCHScl2 = CCHScl / 2 CCHMcl2 = CCHMcl / 2 // CCHSct = nz(CCHMaScl[CCHScl2], CCHSrc) + CCHScmOff CCHScb = nz(CCHMaScl[CCHScl2], CCHSrc) - CCHScmOff // CCHMct = nz(CCHMaMcl[CCHMcl2], CCHSrc) + CCHMcmOff CCHMcb = nz(CCHMaMcl[CCHMcl2], CCHSrc) - CCHMcmOff // CCHScmm = math.avg(CCHSct, CCHScb) // CCHOmed = (CCHScmm - CCHMcb) / (CCHMct - CCHMcb) CCHOshort = (CCHSrc - CCHMcb) / (CCHMct - CCHMcb) // CCHSlowOSC = CCHOmed CCHFastOSC = CCHOshort // CCHMidPoint = 0.5 isCCHUpTrend = CCHFastOSC > CCHMidPoint isCCHDownTrend = CCHFastOSC < CCHMidPoint CCHTrendUp = ta.crossover(CCHFastOSC, CCHMidPoint) CCHTrendDown = ta.crossunder(CCHFastOSC, CCHMidPoint) CCHTrendBullish = ta.crossover(CCHFastOSC, CCHSlowOSC) and isBullishCandle() // CCHFastOSCDiff = CCHFastOSC - CCHFastOSC[1] CCHSlowOSCDiff = CCHSlowOSC - CCHSlowOSC[1] // CCHBc = (CCHOshort > 0.5) ? (CCHOshort > 1.0 ? color.purple : (CCHOshort > CCHOmed ? color.lime : color.green)) : (CCHOshort < 0 ? color.purple : ( CCHOshort < CCHOmed ? color.red : color.orange)) /////////////////////// // END Cycle Channel /////////////////////// ////////////////////// // START Impuls MACD ////////////////////// // IMPMACDLengthMA = 34 IMPMACDLengthSignal = 9 // IMPMACDSrc = hlc3 IMPMACDHi = calc_smma(high, IMPMACDLengthMA) IMPMACDLo = calc_smma(low, IMPMACDLengthMA) IMPMACDNi = calc_zlema(IMPMACDSrc, IMPMACDLengthMA) // IMPMACDMd = (IMPMACDNi > IMPMACDHi) ? (IMPMACDNi - IMPMACDHi) : (IMPMACDNi < IMPMACDLo) ? (IMPMACDNi - IMPMACDLo) : 0.0 IMPMACDSb = ta.sma(IMPMACDMd, IMPMACDLengthSignal) IMPMACDSh = IMPMACDMd - IMPMACDSb // IMPMACDIsBullish = (ta.crossunder(IMPMACDSb, IMPMACDMd) or ta.crossunder(IMPMACDSb[1], IMPMACDMd) or ta.crossunder(IMPMACDSb[2], IMPMACDMd)) and IMPMACDMd < 0 and IMPMACDSh > 0.1 and IMPMACDSb < IMPMACDMd and IMPMACDMd < -0.6 IMPMACDIsBearish = (ta.crossover(IMPMACDSb, IMPMACDMd) or ta.crossover(IMPMACDSb[1], IMPMACDMd) or ta.crossover(IMPMACDSb[2], IMPMACDMd)) and IMPMACDMd > 0 and IMPMACDSh < -0.1 and IMPMACDSb > IMPMACDMd and IMPMACDMd > 0.6 ////////////////////// // END Impuls MACD ////////////////////// /////////////////////// // START Strategy ... /////////////////////// // canShowStopLoss = showSignals and showStopLosses and (showLongSignals or showShortSignals) and (showLongStopLosses or showShortStopLosses) canShowLongStopLoss = canShowStopLoss and showLongStopLosses canShowShortStopLoss = canShowStopLoss and showShortStopLosses // hasLongSignal = IMPMACDIsBullish and TMTrendUp and isBullishCandle() // and open < TMMagicTrend longSignal = hasLongSignal ? bar_index : na float longStopLoss = lastMarketLowest // hasShortSignal = IMPMACDIsBearish and TMTrendDown and isBearishCandle() // and open > TMMagicTrend shortSignal = hasShortSignal ? bar_index : na float shortStopLoss = lastMarketHighest // hasSignal = hasLongSignal or hasShortSignal // canShowSignal = showSignals and (showLongSignals or showShortSignals) canShowLongSignal = canShowSignal and showLongSignals and hasLongSignal canShowShortSignal = canShowSignal and showShortSignals and hasShortSignal /////////////////////// // END Strategy ... /////////////////////// // // END Calculations .... // // // START Plots .... // // // Signals ... plotshape(canShowLongSignal ? longSignal : na, title = "Long Signal", color = longColor, location = location.belowbar, style = shape.triangleup, size = size.normal) plotshape(canShowShortSignal ? shortSignal : na, title = "Short Signal", color = shortColor, location = location.abovebar, style = shape.triangledown, size = size.normal) // // Stop Losses ... plot(series = canShowLongStopLoss ? longStopLoss : na, color = color.fuchsia, linewidth = 1, style = plot.style_stepline, title = "Long Stop Loss") plot(series = canShowShortStopLoss ? shortStopLoss : na, color = color.aqua, linewidth = 1, style = plot.style_stepline, title = "Short Stop Loss") // // END Plots .... // // // START Alerts ... // alertcondition(hasSignal, "XST_SHULL5M > Signal") alertcondition(hasLongSignal, "XST_SHULL5M > Long Signal") alertcondition(hasShortSignal, "XST_SHULL5M > Short Signal") // // END Alerts ... // ////////////////////////////////////////////////////// // TODOS: // ------- // - [] //////////////////////////////////////////////////////