345 lines
9.2 KiB
Plaintext
345 lines
9.2 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// 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:
|
|
// -------
|
|
// - []
|
|
//////////////////////////////////////////////////////
|