OPEN-SOURCE SCRIPT
FxInside

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org/MPL/2.0/
// © yyy_trade
//version=6
indicator("FxInside", overlay = true, max_lines_count = 500)
lineColor = input.color(color.new(color.blue, 12), "FxLineColor")
type vaild_struct
float high
float low
int time
type fx
string dir
chart.point point
var array<vaild_struct> valid_arr = array.new<vaild_struct>()
var fx lastFx = na
var float motherHigh = na
var float motherLow = na
isInsideBar = high <= high[1] and low >= low[1]
if isInsideBar and na(motherHigh)
motherHigh := high[1]
motherLow := low[1]
isExtendedInsideBar = not na(motherHigh) and high <= motherHigh and low >= motherLow
body_color = input.color(color.new(color.orange, 0), "实体颜色")
wick_color = input.color(color.new(color.orange, 0), "影线颜色")
border_color = input.color(color.new(color.orange, 0), "边框颜色")
plotcandle(open, high, low, close, color=isExtendedInsideBar ? body_color : na, wickcolor=isExtendedInsideBar ? wick_color : na, bordercolor =isExtendedInsideBar ? border_color : na ,editable=false)
if not na(motherHigh) and (high > motherHigh or low < motherLow)
motherHigh := na
motherLow := na
// 以下为分型折线逻辑,如不需要可删除
process_fx(last_fx, now_fx) =>
if not na(last_fx)
line.new(last_fx.point, now_fx.point, color=lineColor, xloc=xloc.bar_time)
now_fx
if not isExtendedInsideBar
array.push(valid_arr, vaild_struct.new(high, low, time))
if array.size(valid_arr) > 17
array.shift(valid_arr)
len = array.size(valid_arr)
if len > 3
k_ago = array.get(valid_arr, len - 2)
k_now = array.get(valid_arr, len - 1)
if k_ago.high > k_now.high
for i = 3 to len
last_k = array.get(valid_arr, len - i)
if last_k.high < k_ago.high
if last_k.low < k_ago.low
lastFx := process_fx(lastFx, fx.new("TOP", chart.point.from_time(k_ago.time, k_ago.high)))
break
else
if not na(lastFx)
if lastFx.dir == "TOP"
lastFx := process_fx(lastFx, fx.new("BOT", chart.point.from_time(last_k.time, last_k.low)))
lastFx := process_fx(lastFx, fx.new("TOP", chart.point.from_time(k_ago.time, k_ago.high)))
break
else if last_k.high > k_ago.high
break
// 底分型判定
if k_ago.low < k_now.low
for i = 3 to len
last_k = array.get(valid_arr, len - i)
if last_k.low > k_ago.low
if last_k.high > k_ago.high
lastFx := process_fx(lastFx, fx.new("BOT", chart.point.from_time(k_ago.time, k_ago.low)))
break
else
if not na(lastFx)
if lastFx.dir == "BOT"
lastFx := process_fx(lastFx, fx.new("TOP", chart.point.from_time(last_k.time, last_k.high)))
lastFx := process_fx(lastFx, fx.new("BOT", chart.point.from_time(k_ago.time, k_ago.low)))
break
else if last_k.low < k_ago.low
break
len = input.int(20, minval=1, title="Length")
src = input(close, title="Source")
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500, display = display.data_window)
out = ta.ema(src, len)
plot(out, title="EMA", color=color.blue, offset=offset)
// Smoothing MA inputs
GRP = "Smoothing"
TT_BB = "Only applies when 'SMA + Bollinger Bands' is selected. Determines the distance between the SMA and the bands."
maTypeInput = input.string("None", "Type", options = ["None", "SMA", "SMA + Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = GRP, display = display.data_window)
maLengthInput = input.int(14, "Length", group = GRP, display = display.data_window)
bbMultInput = input.float(2.0, "BB StdDev", minval = 0.001, maxval = 50, step = 0.5, tooltip = TT_BB, group = GRP, display = display.data_window)
var enableMA = maTypeInput != "None"
var isBB = maTypeInput == "SMA + Bollinger Bands"
// Smoothing MA Calculation
ma(source, length, MAtype) =>
switch MAtype
"SMA" => ta.sma(source, length)
"SMA + Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
// Smoothing MA plots
smoothingMA = enableMA ? ma(out, maLengthInput, maTypeInput) : na
smoothingStDev = isBB ? ta.stdev(out, maLengthInput) * bbMultInput : na
plot(smoothingMA, "EMA-based MA", color=color.yellow, display = enableMA ? display.all : display.none, editable = enableMA)
bbUpperBand = plot(smoothingMA + smoothingStDev, title = "Upper Bollinger Band", color=color.green, display = isBB ? display.all : display.none, editable = isBB)
bbLowerBand = plot(smoothingMA - smoothingStDev, title = "Lower Bollinger Band", color=color.green, display = isBB ? display.all : display.none, editable = isBB)
fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill", display = isBB ? display.all : display.none, editable = isBB)
// © yyy_trade
//version=6
indicator("FxInside", overlay = true, max_lines_count = 500)
lineColor = input.color(color.new(color.blue, 12), "FxLineColor")
type vaild_struct
float high
float low
int time
type fx
string dir
chart.point point
var array<vaild_struct> valid_arr = array.new<vaild_struct>()
var fx lastFx = na
var float motherHigh = na
var float motherLow = na
isInsideBar = high <= high[1] and low >= low[1]
if isInsideBar and na(motherHigh)
motherHigh := high[1]
motherLow := low[1]
isExtendedInsideBar = not na(motherHigh) and high <= motherHigh and low >= motherLow
body_color = input.color(color.new(color.orange, 0), "实体颜色")
wick_color = input.color(color.new(color.orange, 0), "影线颜色")
border_color = input.color(color.new(color.orange, 0), "边框颜色")
plotcandle(open, high, low, close, color=isExtendedInsideBar ? body_color : na, wickcolor=isExtendedInsideBar ? wick_color : na, bordercolor =isExtendedInsideBar ? border_color : na ,editable=false)
if not na(motherHigh) and (high > motherHigh or low < motherLow)
motherHigh := na
motherLow := na
// 以下为分型折线逻辑,如不需要可删除
process_fx(last_fx, now_fx) =>
if not na(last_fx)
line.new(last_fx.point, now_fx.point, color=lineColor, xloc=xloc.bar_time)
now_fx
if not isExtendedInsideBar
array.push(valid_arr, vaild_struct.new(high, low, time))
if array.size(valid_arr) > 17
array.shift(valid_arr)
len = array.size(valid_arr)
if len > 3
k_ago = array.get(valid_arr, len - 2)
k_now = array.get(valid_arr, len - 1)
if k_ago.high > k_now.high
for i = 3 to len
last_k = array.get(valid_arr, len - i)
if last_k.high < k_ago.high
if last_k.low < k_ago.low
lastFx := process_fx(lastFx, fx.new("TOP", chart.point.from_time(k_ago.time, k_ago.high)))
break
else
if not na(lastFx)
if lastFx.dir == "TOP"
lastFx := process_fx(lastFx, fx.new("BOT", chart.point.from_time(last_k.time, last_k.low)))
lastFx := process_fx(lastFx, fx.new("TOP", chart.point.from_time(k_ago.time, k_ago.high)))
break
else if last_k.high > k_ago.high
break
// 底分型判定
if k_ago.low < k_now.low
for i = 3 to len
last_k = array.get(valid_arr, len - i)
if last_k.low > k_ago.low
if last_k.high > k_ago.high
lastFx := process_fx(lastFx, fx.new("BOT", chart.point.from_time(k_ago.time, k_ago.low)))
break
else
if not na(lastFx)
if lastFx.dir == "BOT"
lastFx := process_fx(lastFx, fx.new("TOP", chart.point.from_time(last_k.time, last_k.high)))
lastFx := process_fx(lastFx, fx.new("BOT", chart.point.from_time(k_ago.time, k_ago.low)))
break
else if last_k.low < k_ago.low
break
len = input.int(20, minval=1, title="Length")
src = input(close, title="Source")
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500, display = display.data_window)
out = ta.ema(src, len)
plot(out, title="EMA", color=color.blue, offset=offset)
// Smoothing MA inputs
GRP = "Smoothing"
TT_BB = "Only applies when 'SMA + Bollinger Bands' is selected. Determines the distance between the SMA and the bands."
maTypeInput = input.string("None", "Type", options = ["None", "SMA", "SMA + Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = GRP, display = display.data_window)
maLengthInput = input.int(14, "Length", group = GRP, display = display.data_window)
bbMultInput = input.float(2.0, "BB StdDev", minval = 0.001, maxval = 50, step = 0.5, tooltip = TT_BB, group = GRP, display = display.data_window)
var enableMA = maTypeInput != "None"
var isBB = maTypeInput == "SMA + Bollinger Bands"
// Smoothing MA Calculation
ma(source, length, MAtype) =>
switch MAtype
"SMA" => ta.sma(source, length)
"SMA + Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
// Smoothing MA plots
smoothingMA = enableMA ? ma(out, maLengthInput, maTypeInput) : na
smoothingStDev = isBB ? ta.stdev(out, maLengthInput) * bbMultInput : na
plot(smoothingMA, "EMA-based MA", color=color.yellow, display = enableMA ? display.all : display.none, editable = enableMA)
bbUpperBand = plot(smoothingMA + smoothingStDev, title = "Upper Bollinger Band", color=color.green, display = isBB ? display.all : display.none, editable = isBB)
bbLowerBand = plot(smoothingMA - smoothingStDev, title = "Lower Bollinger Band", color=color.green, display = isBB ? display.all : display.none, editable = isBB)
fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill", display = isBB ? display.all : display.none, editable = isBB)
Open-source script
In true TradingView spirit, the creator of this script has made it open-source, so that traders can review and verify its functionality. Kudos to the author! While you can use it for free, remember that republishing the code is subject to our House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.
Open-source script
In true TradingView spirit, the creator of this script has made it open-source, so that traders can review and verify its functionality. Kudos to the author! While you can use it for free, remember that republishing the code is subject to our House Rules.
Disclaimer
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.