Initial Commit ...
This commit is contained in:
@@ -0,0 +1,299 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center XTrade SCCH15M Strategy
|
||||
// ---------------------------------------------
|
||||
// SaherElm Custom Private Strategy ...
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
//@version=5
|
||||
indicator(title="SaherElm XTrade SCCH15M Strategy", shorttitle = "XST_SCCH15M", 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")
|
||||
showTakeProfits = input.bool(defval = true, title = "Show Take Profits", 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")
|
||||
|
||||
//
|
||||
// Take Profits ...
|
||||
riskRewardRatio = input.float(defval = 1.5, title = "Risk To Reward Ratio", group = "Take Profit")
|
||||
|
||||
//
|
||||
longTakeProfitColor = input.color(defval = color.yellow, title = "Long TPs Color", group = "Take Profit")
|
||||
shortTakeProfitColor = input.color(defval = color.lime, title = "Short TPs Color", group = "Take Profit")
|
||||
|
||||
//
|
||||
showLongTakeProfits = input.bool(defval = true, title = "Show Long Take Profits", group = "Take Profit")
|
||||
showShortTakeProfits = input.bool(defval = true, title = "Show Short Take Profits", group = "Take Profit")
|
||||
//
|
||||
// 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
|
||||
/////////////////////////////
|
||||
//
|
||||
// END Functions ....
|
||||
//
|
||||
|
||||
//
|
||||
// START Calculations ....
|
||||
//
|
||||
//
|
||||
var longColor = color.aqua
|
||||
var shortColor = color.fuchsia
|
||||
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 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 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))
|
||||
|
||||
//
|
||||
// RED ...
|
||||
CCHFastOSC = CCHOshort
|
||||
|
||||
//
|
||||
// Green ...
|
||||
CCHSlowOSC = CCHOmed
|
||||
|
||||
//
|
||||
CCHMidOSC = CCHFastOSC >= CCHSlowOSC ? (CCHFastOSC - CCHSlowOSC) / 2 : (CCHSlowOSC - CCHFastOSC) / 2
|
||||
|
||||
//
|
||||
isCCHFastOSCCrossOverCCHSlowOSC = ta.crossover(CCHFastOSC, CCHSlowOSC)
|
||||
isCCHFastOSCCrossUnderCCHSlowOSC = ta.crossunder(CCHFastOSC, CCHSlowOSC)
|
||||
|
||||
//
|
||||
hasCCHBullishSignal = isCCHFastOSCCrossOverCCHSlowOSC and CCHMidOSC >= 0.02
|
||||
hasCCHBearishSignal = isCCHFastOSCCrossUnderCCHSlowOSC and CCHMidOSC >= 0.02
|
||||
|
||||
//
|
||||
hasCCHSignal = hasCCHBullishSignal or hasCCHBearishSignal
|
||||
///////////////////////
|
||||
// END Cycle Channel
|
||||
///////////////////////
|
||||
|
||||
///////////////////////
|
||||
// START Strategy ...
|
||||
///////////////////////
|
||||
//
|
||||
canShowStopLoss = showSignals and showStopLosses and (showLongSignals or showShortSignals) and (showLongStopLosses or showShortStopLosses)
|
||||
canShowLongStopLoss = canShowStopLoss and showLongStopLosses
|
||||
canShowShortStopLoss = canShowStopLoss and showShortStopLosses
|
||||
|
||||
//
|
||||
canShowTakeProfit = showSignals and showTakeProfits and (showLongSignals or showShortSignals) and (showLongTakeProfits or showShortTakeProfits)
|
||||
canShowLongTakeProfit = canShowTakeProfit and showLongTakeProfits
|
||||
canShowShortTakeProfit = canShowTakeProfit and showShortTakeProfits
|
||||
|
||||
//
|
||||
hasSignal = hasCCHSignal
|
||||
|
||||
//
|
||||
stopLossThreshold = 0.0
|
||||
|
||||
//
|
||||
hasLongSignal = hasSignal and hasCCHBullishSignal
|
||||
longSignal = hasLongSignal ? bar_index : na
|
||||
longStopLoss = lastMarketLowest
|
||||
longTakeProfit = open + (open - longStopLoss - stopLossThreshold) * riskRewardRatio
|
||||
|
||||
//
|
||||
hasShortSignal = hasSignal and hasCCHBearishSignal
|
||||
shortSignal = hasShortSignal ? bar_index : na
|
||||
shortStopLoss = lastMarketHighest
|
||||
shortTakeProfit = open + (open - shortStopLoss - stopLossThreshold) * riskRewardRatio
|
||||
|
||||
//
|
||||
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.small)
|
||||
plotshape(canShowShortSignal ? shortSignal : na, title = "Short Signal", color = shortColor, location = location.abovebar, style = shape.triangledown, size = size.small)
|
||||
|
||||
//
|
||||
// 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")
|
||||
|
||||
//
|
||||
// Long Take Profits ...
|
||||
if hasLongSignal and canShowLongSignal and canShowLongTakeProfit
|
||||
lTp = line.new(x1 = bar_index, y1 = longTakeProfit, x2 = bar_index + swingLoopback, y2 = longTakeProfit, color = longTakeProfitColor, width = 2, style = line.style_arrow_right)
|
||||
|
||||
//
|
||||
// Short Take Profits ...
|
||||
if hasShortSignal and canShowShortSignal and canShowShortTakeProfit
|
||||
sTp = line.new(x1 = bar_index, y1 = shortTakeProfit, x2 = bar_index + swingLoopback, y2 = shortTakeProfit, color = shortTakeProfitColor, width = 2, style = line.style_arrow_right)
|
||||
//
|
||||
// END Plots ....
|
||||
//
|
||||
|
||||
//
|
||||
// START Alerts ...
|
||||
//
|
||||
alertcondition(hasSignal, "XST_SCCH15M > Signal")
|
||||
alertcondition(hasLongSignal, "XST_SCCH15M > Long Signal")
|
||||
alertcondition(hasShortSignal, "XST_SCCH15M > Short Signal")
|
||||
//
|
||||
// END Alerts ...
|
||||
//
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
// TODOS:
|
||||
// -------
|
||||
// - []
|
||||
//////////////////////////////////////////////////////
|
||||
Reference in New Issue
Block a user