Files
xPineScript/xStrategies/XST_SR15M/xst_sr15m.pine
T
2024-01-25 04:07:49 +03:30

354 lines
9.0 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center XTrade SR15M Strategy
// ---------------------------------------------
// in this strategy i must use:
// - Price Action Candle Recognition;
// - Leledc Levels (IS) InSillico;
// - ATR Stop Loss garethyeo;
// - Cycle Channel Oscillator;
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
//@version=5
indicator(title="SaherElm XTrade SR15M Strategy", shorttitle = "XST_SR15M", 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")
showSupportResistance = input.bool(defval = false, title = "Show Support and Resistance", 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 ...
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 Leledc Levels
///////////////////////
//
Lelec(bars, len) =>
//
result = 0
bindex = int(na)
bindex := nz(bindex[1], 0)
sindex = int(na)
sindex := nz(sindex[1], 0)
//
bindex := close > close[4] ? bindex + 1 : bindex
sindex := close < close[4] ? sindex + 1 : sindex
//
lowest = ta.lowest(low, len)
highest = ta.highest(high, len)
//
if bindex > bars and close < open and high >= highest
bindex := 0
result := -1
result
else
if sindex > bars and close > open and low <= lowest
sindex := 0
result := 1
result
///////////////////////
// END Leledc Levels
///////////////////////
//
// END Functions ....
//
//
// START Calculations ....
//
//
var shortColor = color.red
var longColor = color.lime
//////////////////////////////
// START Price Action Candles
//////////////////////////////
//
var bullishColor = color.lime
var bullishShape = shape.arrowup
var bullishTitle = "Bullish"
var bullishType = 1
//
var bearishColor = color.red
var bearishShape = shape.arrowdown
var bearishTitle = "Bearish"
var bearishType = -1
//
var neutralColor = color.gray
var neutralShape = shape.circle
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 Leledc Levels
///////////////////////
//
LLBars = 42
LLLength = 40
LLLevelSwitch = true
LLThicknesSwitch = 7
LLExhaustionSwitch = true
//
// Out C ...
Lelex = Lelec(LLBars, LLLength)
//
// Out Bar ...
LLHighLel = Lelex == -1 ? high : na
LLLowLel = Lelex == 1 ? low : na
//
// Out level ...
LLResistance = float(na)
LLSupport = float(na)
LLResistance := close < open and Lelex ? high : LLResistance[1]
LLSupport := close > open and Lelex ? low : LLSupport[1]
//
// Resistance Color ...
LLResistanceColor = shortColor
LLHighColor = ta.change(LLResistance) == 0 ? LLResistanceColor : na
//
// Support Color ...
LLSupportColor = longColor
LLLowColor = ta.change(LLSupport) == 0 ? LLSupportColor : na
//
// Has Signal ...
LLHasSignal = LLExhaustionSwitch
//
// Up Signals ...
LLUpSignal = LLHasSignal ? LLLowLel : na
//
// Down Signals ...
LLDownSignal = LLHasSignal ? LLHighLel : na
///////////////////////
// END Leledc Levels
///////////////////////
///////////////////////
// START ATR Stop Loss
///////////////////////
//
ATRSLSource = low
ATRSLLength = 14
ATRSLMultiplier = 1.6
//
ATRSLLongStopLoss = ATRSLSource - ta.atr(ATRSLLength) * ATRSLMultiplier
ATRSLShortStopLoss = ATRSLSource + ta.atr(ATRSLLength) * ATRSLMultiplier
///////////////////////
// END ATR Stop Loss
///////////////////////
///////////////////////
// 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)
//
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 Strategy ...
///////////////////////
//
canShowStopLoss = showSignals and showStopLosses and (showLongSignals or showShortSignals) and (showLongStopLosses or showShortStopLosses)
canShowLongStopLoss = canShowStopLoss and showLongStopLosses and not na(ATRSLLongStopLoss)
canShowShortStopLoss = canShowStopLoss and showShortStopLosses and not na(ATRSLShortStopLoss)
//
// retrieve verification from CCH ...
//
// Red Line ...
fastLine = CCHOshort
// plot(fastLine, color = color.red)
//
// Green Line ...
slowLine = CCHOmed
// plot(slowLine, color = color.green)
//
// CCH Long Verification ...
isLongPositionVerifiedByCCH = fastLine < 0.5 and slowLine < 0.5 and fastLine < slowLine
//
// CCH Short Verification ...
isShortPositionVerifiedByCCH = fastLine > 0.5 and slowLine > 0.5 and fastLine > slowLine
//
hasSignal = LLHasSignal
//
hasLongSignal = hasSignal and not na(LLUpSignal) and isLongPositionVerifiedByCCH and isBullishCandle()
longSignal = hasLongSignal ? LLUpSignal : na
//
hasShortSignal = hasSignal and not na(LLDownSignal) and isShortPositionVerifiedByCCH and isBearishCandle()
shortSignal = hasShortSignal ? LLDownSignal : na
//
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 ? ATRSLLongStopLoss : na, color = color.fuchsia, linewidth = 1, style = plot.style_stepline, title = "Long Stop Loss")
plot(series = canShowShortStopLoss ? ATRSLShortStopLoss : na, color = color.aqua, linewidth = 1, style = plot.style_stepline, title = "Short Stop Loss")
//
// Support and Resistance level ...
plot(showSupportResistance and LLLevelSwitch ? LLSupport : na, title = "Support Level", style = plot.style_line, color = LLLowColor, linewidth = LLThicknesSwitch)
plot(showSupportResistance and LLLevelSwitch ? LLResistance : na, title = "Reistance Level", style = plot.style_line, color = LLHighColor, linewidth = LLThicknesSwitch)
//
// END Plots ....
//
//
// START Alerts ...
//
alertcondition(hasSignal, "XST_SR15M > Signal")
alertcondition(hasLongSignal, "XST_SR15M > Long Signal")
alertcondition(hasShortSignal, "XST_SR15M > Short Signal")
//
// END Alerts ...
//
//////////////////////////////////////////////////////
// TODOS:
// -------
// - []
//////////////////////////////////////////////////////