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)
Açık kaynak kodlu komut dosyası
Gerçek TradingView ruhuyla, bu komut dosyasının mimarı, yatırımcıların işlevselliğini inceleyip doğrulayabilmesi için onu açık kaynaklı hale getirdi. Yazarı tebrik ederiz! Ücretsiz olarak kullanabilseniz de, kodu yeniden yayınlamanın Topluluk Kurallarımıza tabi olduğunu unutmayın.
Feragatname
Bilgiler ve yayınlar, TradingView tarafından sağlanan veya onaylanan finansal, yatırım, alım satım veya diğer türden tavsiye veya öneriler anlamına gelmez ve teşkil etmez. Kullanım Koşulları bölümünde daha fazlasını okuyun.
Açık kaynak kodlu komut dosyası
Gerçek TradingView ruhuyla, bu komut dosyasının mimarı, yatırımcıların işlevselliğini inceleyip doğrulayabilmesi için onu açık kaynaklı hale getirdi. Yazarı tebrik ederiz! Ücretsiz olarak kullanabilseniz de, kodu yeniden yayınlamanın Topluluk Kurallarımıza tabi olduğunu unutmayın.
Feragatname
Bilgiler ve yayınlar, TradingView tarafından sağlanan veya onaylanan finansal, yatırım, alım satım veya diğer türden tavsiye veya öneriler anlamına gelmez ve teşkil etmez. Kullanım Koşulları bölümünde daha fazlasını okuyun.