本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed
// __ __ __ __ __ __ __ __ __ __ __ _______ __ __ __
// / | / | / | _ / |/ | / \ / | / | / \ / | / | / \ / \ / | / |
// $$ | $$ | ______ $$ | / \ $$ |$$ |____ ______ $$ \ /$$ | __ __ _______ _$$ |_ $$ \ $$ | ______ _$$ |_ $$$$$$$ | ______ $$ \ $$ | ______ _____ ____ ______ ____$$ |
// $$ |__$$ | / \ $$ |/$ \$$ |$$ \ / \ $$$ \ /$$$ |/ | / | / |/ $$ | $$$ \$$ | / \ / $$ | $$ |__$$ | / \ $$$ \$$ | / \ / \/ \ / \ / $$ |
// $$ $$ |/$$$$$$ |$$ /$$$ $$ |$$$$$$$ |/$$$$$$ |$$$$ /$$$$ |$$ | $$ |/$$$$$$$/ $$$$$$/ $$$$ $$ |/$$$$$$ |$$$$$$/ $$ $$< /$$$$$$ |$$$$ $$ | $$$$$$ |$$$$$$ $$$$ |/$$$$$$ |/$$$$$$$ |
// $$$$$$$$ |$$ $$ |$$ $$/$$ $$ |$$ | $$ |$$ | $$ |$$ $$ $$/$$ |$$ | $$ |$$ \ $$ | __ $$ $$ $$ |$$ | $$ | $$ | __ $$$$$$$ |$$ $$ |$$ $$ $$ | / $$ |$$ | $$ | $$ |$$ $$ |$$ | $$ |
// $$ | $$ |$$$$$$$$/ $$$$/ $$$$ |$$ | $$ |$$ \__$$ |$$ |$$$/ $$ |$$ \__$$ | $$$$$$ | $$ |/ |$$ |$$$$ |$$ \__$$ | $$ |/ |$$ |__$$ |$$$$$$$$/ $$ |$$$$ |/$$$$$$$ |$$ | $$ | $$ |$$$$$$$$/ $$ \__$$ |
// $$ | $$ |$$ |$$$/ $$$ |$$ | $$ |$$ $$/ $$ | $/ $$ |$$ $$/ / $$/ $$ $$/ $$ | $$$ |$$ $$/ $$ $$/ $$ $$/ $$ |$$ | $$$ |$$ $$ |$$ | $$ | $$ |$$ |$$ $$ |
// $$/ $$/ $$$$$$$/ $$/ $$/ $$/ $$/ $$$$$$/ $$/ $$/ $$$$$$/ $$$$$$$/ $$$$/ $$/ $$/ $$$$$$/ $$$$/ $$$$$$$/ $$$$$$$/ $$/ $$/ $$$$$$$/ $$/ $$/ $$/ $$$$$$$/ $$$$$$$/
//
//
//
//@version=5
indicator("Extreme Trend Reversal Points [HeWhoMustNotBeNamed]", overlay=true)
import HeWhoMustNotBeNamed/_matrix/5 as ma
import HeWhoMustNotBeNamed/drawingutils/8 as dr
import HeWhoMustNotBeNamed/arrayutils/21 as ar
import HeWhoMustNotBeNamed/enhanced_ta/14 as eta
source = input.source(close, "Source", group="Moving Average")
type = input.string("sma", "Type", options = ["sma", "ema", "rma", "wma"], group="Moving Average")
length = input.int(20, "Length", step=5, group="Moving Average")
level = input.int(10, "Level", minval = 5, step=5, group="Moving Average")
minMaxRangePercentile = input.int(20, 'Range Percentile', minval=5, maxval=45, step=5)
extremeMinMaxRangePercentile = input.int(45, 'Extreme Range Percentile', minval=40, maxval=48, step=2)
history = input.int(1000, 'Percentile History', minval=1000, maxval=5000, step=500)
maxHistory = length-1
ema(float currentEma, float source, simple int length) =>
k = 2 / (length + 1)
ema = source * k + (1 - k) * currentEma
ema
rma(float currentRma, float source, simple int length) =>
k = 2 / (length + 1)
rma = (currentRma * (length-1) + source)/length
rma
var maMatrix = matrix.new<float>(1, level+1, close)
if(type == "ema")
emaArray = array.new<float>(1, close)
for i=1 to matrix.columns(maMatrix)-1
ema = ema(matrix.get(maMatrix, 0, i), array.get(emaArray, array.size(emaArray)-1), length)
array.push(emaArray, ema)
ma.unshift(maMatrix, emaArray, maxHistory)
if(type == "rma")
rmaArray = array.new<float>(1, close)
for i=1 to matrix.columns(maMatrix)-1
rma = rma(matrix.get(maMatrix, 0, i), array.get(rmaArray, array.size(rmaArray)-1), length)
array.push(rmaArray, rma)
ma.unshift(maMatrix, rmaArray, maxHistory)
if(type == "sma" or type == "wma")
maArray = array.new<float>(1, source)
for i=1 to matrix.columns(maMatrix)-1
values = matrix.col(maMatrix, i-1)
tmpArray = array.new<float>(1, array.get(maArray, i-1))
tmpArray := array.concat(tmpArray, values)
array.push(maArray, ar.ma(tmpArray, type, length))
ma.unshift(maMatrix, maArray, maxHistory)
var linesArray = array.new<line>()
var labelsArray = array.new<label>()
ar.clear(linesArray)
ar.clear(labelsArray)
strength = 0
bearishStrength = 0
for i = 0 to level-1
for j = i+1 to level
pma = matrix.get(maMatrix, 0, i)
nma = matrix.get(maMatrix, 0, j)
strength := pma > nma ? strength+1 : strength
lastRow = matrix.row(maMatrix, 0)
lastRowIndex = array.sort_indices(array.slice(lastRow, 1, array.size(lastRow)), order.descending)
if(barstate.islast)
for i=1 to level
levelColor = color.from_gradient(i, 1, level, color.green, color.red)
dr.draw_labelled_line(array.get(lastRow, i), type+'('+str.tostring(i)+')',levelColor, levelColor, 0, true, linesArray, labelsArray)
minRange = ta.percentile_nearest_rank(strength, history, 50-minMaxRangePercentile)
maxRange = ta.percentile_nearest_rank(strength, history, 50+minMaxRangePercentile)
extremeMinRange = ta.percentile_nearest_rank(strength, history, 50-extremeMinMaxRangePercentile)
extremeMaxRange = ta.percentile_nearest_rank(strength, history, 50+extremeMinMaxRangePercentile)
plotColor = strength > extremeMaxRange? color.green :
strength > maxRange? color.lime :
strength < extremeMinRange ? color.red :
strength < minRange? color.orange : color.silver
maxStrength = level * (level+1)/2
ma = eta.ma(source, type, length)
plotshape(strength[1]==maxStrength and ta.crossunder(source, ma), 'Bullish Trend Reversal Point',
style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
plotshape(strength[1]==0 and ta.crossover(source, ma), 'Bearish Trend Reversal Point',
style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plot(strength, "Strength", color=color.silver, display = display.data_window)
plot(minRange, "Min Range", color=color.orange, display = display.data_window)
plot(maxRange, "Max Range", color=color.lime, display = display.data_window)
plot(extremeMinRange, "Extreme Min Range", color=color.red, display = display.data_window)
plot(extremeMaxRange, "Extreme Max Range", color=color.green, display = display.data_window)
plot(ma, "Moving Average", plotColor)