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

288 lines
8.3 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center XTrade RF15M Strategy
// ---------------------------------------------
// in this strategy i must use:
// - Price Action Candle Recognition;
// -
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
//@version=5
indicator(title="SaherElm XTrade RF15M Strategy", shorttitle = "XST_RF15M", 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")
showRangeFilter = input.bool(defval = false, title = "Show Range Filter", 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 Range Filter Buy Sell
///////////////////////////////
//
// Smooth Average Range
smoothAverageRange(x, t, m) =>
wper = t * 2 - 1
avrng = ta.ema(math.abs(x - x[1]), t)
result = ta.ema(avrng, wper) * m
result
//
// Range Filter ...
rangeFilter(x, r) =>
result = x
result := x > nz(result[1]) ? x - r < nz(result[1]) ? nz(result[1]) : x - r : x + r > nz(result[1]) ? nz(result[1]) : x + r
result
///////////////////////////////
// END Range Filter Buy Sell
///////////////////////////////
//
// END Functions ....
//
//
// START Calculations ....
//
//
var shortColor = color.red
var longColor = color.lime
var longStopLossColor = color.fuchsia
var shortStopLossColor = color.aqua
//////////////////////////////
// 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 Range Filter Buy Sell
///////////////////////////////
//
// Source
RFBSSrc = close
//
// Sampling Period
RFBSPer = 41
//
// Range Multiplier ...
RFBSMult = 3.0
//
// Color variables ...
RFBSUpColor = color.green
RFBSMidColor = color.blue
RFBSDownColor = color.red
//
RFBSSmrng = smoothAverageRange(RFBSSrc, RFBSPer, RFBSMult)
RFBSFilt = rangeFilter(RFBSSrc, RFBSSmrng)
//
// Filter UP Direction ...
RFBSUpward = 0.0
RFBSUpward := RFBSFilt > RFBSFilt[1] ? nz(RFBSUpward[1]) + 1 : RFBSFilt < RFBSFilt[1] ? 0 : nz(RFBSUpward[1])
//
// Filter DOWN Direction ...
RFBSDownward = 0.0
RFBSDownward := RFBSFilt < RFBSFilt[1] ? nz(RFBSDownward[1]) + 1 : RFBSFilt > RFBSFilt[1] ? 0 : nz(RFBSDownward[1])
//
// Target Bands
RFBSHband = RFBSFilt + RFBSSmrng
RFBSLband = RFBSFilt - RFBSSmrng
//
// Colors
RFBSFiltcolor = RFBSUpward > 0 ? RFBSUpColor : RFBSDownward > 0 ? RFBSDownColor : RFBSMidColor
RFBSBarcolor = RFBSSrc > RFBSFilt and RFBSSrc > RFBSSrc[1] and RFBSUpward > 0 ? RFBSUpColor : RFBSSrc > RFBSFilt and RFBSSrc < RFBSSrc[1] and RFBSUpward > 0 ? RFBSUpColor : RFBSSrc < RFBSFilt and RFBSSrc < RFBSSrc[1] and RFBSDownward > 0 ? RFBSDownColor : RFBSSrc < RFBSFilt and RFBSSrc > RFBSSrc[1] and RFBSDownward > 0 ? RFBSDownColor : RFBSMidColor
//
// Break Outs
RFBSLongCond = bool(na)
RFBSShortCond = bool(na)
RFBSLongCond := RFBSSrc > RFBSFilt and RFBSSrc > RFBSSrc[1] and RFBSUpward > 0 or RFBSSrc > RFBSFilt and RFBSSrc < RFBSSrc[1] and RFBSUpward > 0
RFBSShortCond := RFBSSrc < RFBSFilt and RFBSSrc < RFBSSrc[1] and RFBSDownward > 0 or RFBSSrc < RFBSFilt and RFBSSrc > RFBSSrc[1] and RFBSDownward > 0
//
RFBSCondIni = 0
RFBSCondIni := RFBSLongCond ? 1 : RFBSShortCond ? -1 : RFBSCondIni[1]
RFBSLongCondition = RFBSLongCond and RFBSCondIni[1] == -1
RFBSShortCondition = RFBSShortCond and RFBSCondIni[1] == 1
///////////////////////////////
// END Range Filter Buy Sell
///////////////////////////////
///////////////////////////////
// START Stochastic Histogram
///////////////////////////////
//
STHSLength = 14
STHSSmoothK = 3
//
STHSK = (ta.sma(ta.stoch(close, high, low, STHSLength), STHSSmoothK) - 50)
///////////////////////////////
// END Stochastic Histogram
///////////////////////////////
///////////////////////
// START Strategy ...
///////////////////////
//
canShowStopLoss = showSignals and showStopLosses and (showLongSignals or showShortSignals) and (showLongStopLosses or showShortStopLosses)
canShowLongStopLoss = canShowStopLoss and showLongStopLosses and not na(RFBSLongCondition)
canShowShortStopLoss = canShowStopLoss and showShortStopLosses and not na(RFBSShortCondition)
//
hasSignal = RFBSLongCondition or RFBSShortCondition
//
// Stochastic Verification ...
isStochasticLongVerified = STHSK > 0
isStochasticShortVerified = STHSK < 0
//
// and open > RFBSFilt ...
// and close > RFBSFilt ...
hasLongSignal = hasSignal and not na(RFBSLongCondition) and open > RFBSFilt and isBullishCandle() and isStochasticLongVerified
longSignal = hasLongSignal ? RFBSLongCondition : na
longStopLoss = RFBSLband
//
hasShortSignal = hasSignal and not na(RFBSShortCondition) and isBearishCandle() and isStochasticShortVerified
shortSignal = hasShortSignal ? RFBSShortCondition : na
shortStopLoss = RFBSHband
//
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)
//
plot(series = showRangeFilter ? RFBSFilt : na, color = RFBSFiltcolor, linewidth = 2, title = "RFBS > Range Filter", style = plot.style_line)
//
// Stop Losses ...
plot(series = canShowLongStopLoss ? longStopLoss : na, color = longStopLossColor, linewidth = 1, style = plot.style_line, title = "Long Stop Loss")
plot(series = canShowShortStopLoss ? shortStopLoss : na, color = shortStopLossColor, linewidth = 1, style = plot.style_line, title = "Short Stop Loss")
//
// END Plots ....
//
//
// START Alerts ...
//
alertcondition(hasSignal, "XST_RF15M > Signal")
alertcondition(hasLongSignal, "XST_RF15M > Long Signal")
alertcondition(hasShortSignal, "XST_RF15M > Short Signal")
//
// END Alerts ...
//
//////////////////////////////////////////////////////
// TODOS:
// -------
// - []
//////////////////////////////////////////////////////