예스스탁
예스스탁 답변
2025-07-03 10:36:35
안녕하세요
예스스탁입니다.
올려주신 수식은 내용상 별도의 사용자함수도 많고
주기별로 계산식을 넣어야 하는 내용도 있어
변환해 보는데 시간이 많이 소모됩니다.
업무상 일정이상 요구되는 내용은 답변이 어렵습니다.
도움을 드리지 못해 죄송합니다.
즐거운 하루되세요
> 다올 님이 쓴 글입니다.
> 제목 : 적용가능하도록 부탁드립니다.
> import HeWhoMustNotBeNamed/ta/1
indicator("포인트 CCI", format=format.price, precision=2, explicit_plot_zorder=true)
const string version = "v2.2"
const string groupSettings = "Settings "+ version
var bullcol = input.color(#E91E63, 'Cold Color', group=groupSettings, inline="col")
var bearcol = input.color(#00BCD4, 'Hot Color', group=groupSettings, inline="col")
var invisible = color.rgb(0, 0, 0, 100)
var bullcol_xlight = color.new(bullcol, 80)
var bearcol_xlight = color.new(bearcol, 80)
var bullcol_light = color.new(bullcol, 70)
var bearcol_light = color.new(bearcol, 70)
var bullcol_medium = color.new(bullcol, 60)
var bearcol_medium = color.new(bearcol, 60)
var shortcol = chart.fg_color
var longcol = color.rgb(255,220,100)
var pivotcol = color.white
const int bull_signal_loc = -107
const int bear_signal_loc = 5
const string mode1 = "1 Oscillator Mode"
const string mode2 = "2 Overlay Mode (top and bottom no oscillator)"
const string mode3 = "3 Candle Mode"
mode = input.string(mode1, "Display Mode", options=[mode1, mode2, mode3], tooltip="Modes 2 & 3 are more advanced and expect that you most likely overlay the indicator on top of price action itself or another indiciator using TradingView's object tree panel.", group=groupSettings)
compact = mode == mode2
formula1 = "Standard (2 Period)"
formula2 = "Average"
formula = input.string(formula1, "Formula", options=[formula1, formula2], group=groupSettings)
use_average = formula == formula2
src = input.source(close, "Source", group=groupSettings)
threshold = input.int(20, title="Exhaustion Threshold", minval=1, maxval=50, group=groupSettings, tooltip="Sets the overbought/oversold zone size and offset. Lower values will produce less results, higher values towards 50 will produce many results.")
smoothType = input.string('ema', title="Smoothing Type", options=['sma', 'ema', 'hma', 'rma', 'wma', 'vwma', 'swma', 'highlow', 'linreg', 'median', 'mom', 'percentrank'], group=groupSettings)
average_ma = input.int(3, "Average Formula MA", group=groupSettings)
plot_shading = input.bool(true, title="Fill Gradients in OB/OS Zone", group=groupSettings)
plot_crosses = input.bool(false, title="Highlight Crossovers", group=groupSettings, tooltip="Experimental idea for plotting crossovers with attempted bull/bear coloring. This needs to be combined with other TA but typically crossover condition results in interesting price action during or after.")
plot_zero_crosses = input.bool(false, title="Plot Zero Line Crosses", group=groupSettings, tooltip="Experimental idea for plotting crosses")
const string lookbackGroupName = "Dual Signal Setup (Fast/Slow Lookback)"
shortLength = input.int(title="Fast Length", defval=30, group=lookbackGroupName)
shortSmoothingLength = input.int(7, title="Fast Smoothing Length", group=lookbackGroupName)
longLength = input.int(112, title="Slow Length", minval=1, group=lookbackGroupName)
longSmoothingLength = input.int(3, title="Slow Smoothing Length", group=lookbackGroupName)
_pr(length) =>
float max = ta.highest(length)
float min = ta.lowest(length)
100 * (src - max) / (max - min)
float s_percentR = _pr(shortLength)
float l_percentR = _pr(longLength)
float avg_percentR = math.avg(s_percentR, l_percentR)
if shortSmoothingLength > 1
s_percentR := ta.ma(s_percentR, smoothType, shortSmoothingLength)
if longSmoothingLength > 1
l_percentR := ta.ma(l_percentR, smoothType, longSmoothingLength)
if average_ma > 1
avg_percentR := ta.ma(avg_percentR, smoothType, average_ma)
var was_ob = false
var was_os = false
bool overbought = s_percentR >= -threshold and l_percentR >= -threshold
bool oversold = s_percentR <= -100+threshold and l_percentR <= -100+threshold
bool ob_reversal = not overbought and overbought[1]
bool os_reversal = not oversold and oversold[1]
bool ob_trend_start = overbought and not overbought[1]
bool os_trend_start = oversold and not oversold[1]
bool bool_cross_long1 = ta.crossover(s_percentR, -50)
bool bool_cross_long2 = ta.crossover(l_percentR, -50)
bool cross_zero_long = bool_cross_long1 or bool_cross_long2
bool bool_cross_short1 = ta.crossunder(s_percentR, -50)
bool bool_cross_short2 = ta.crossunder(l_percentR, -50)
bool cross_zero_short = bool_cross_short1 or bool_cross_short2
bool zero_long = (s_percentR > -50 and l_percentR > -50) and cross_zero_long
bool zero_short = (s_percentR < -50 and l_percentR < -50) and cross_zero_short
if use_average
// use average
overbought := avg_percentR >= -threshold
oversold := avg_percentR <= -100+threshold
ob_reversal := not overbought and overbought[1]
os_reversal := not oversold and oversold[1]
ob_trend_start := overbought and not overbought[1]
os_trend_start := oversold and not oversold[1]
bool cross_bear = ta.crossover(l_percentR, s_percentR)
bool cross_bull = ta.crossunder(l_percentR, s_percentR)
middle = hline(mode == mode1 ? -50 : na, 'Middle Line', color.orange, hline.style_solid)
band1 = hline(mode == mode1 ? -20 : na, 'Overbought Line', color.white, hline.style_solid)
band0 = hline(mode == mode1 ? -80 : na, 'Oversold Line', color.white, hline.style_solid)
p_fastr = plot(mode == mode1 and not use_average ? s_percentR : na, "Fast Period %R", color=shortcol, linewidth=1)
p_slowr = plot(mode == mode1 and not use_average ? l_percentR : na, "Slow Period %R", color=longcol, linewidth=1)
p_avgr = plot(mode == mode1 and use_average ? avg_percentR : na, "Average Formula %R", color=shortcol, linewidth=1)
gradientBullColor = plot_shading ? color.new(bullcol, 100) : invisible
gradientBearColor = plot_shading ? color.new(bearcol, 100) : invisible
fill(p_fastr, p_slowr, 0, -30, top_color = color.new(gradientBearColor, 0), bottom_color = gradientBearColor, title = "Overbought Gradient Fill")
fill(p_fastr, p_slowr, -70, -100, top_color = gradientBullColor, bottom_color = color.new(gradientBullColor, 0), title = "Oversold Gradient Fill")
plotshape(ob_reversal ? bear_signal_loc : na, title="Overbought Trend Reversal ▼", style=shape.triangledown, location=mode == mode1 ? location.absolute : mode == mode3 ? location.abovebar : location.top, color=bullcol, text='', textcolor=invisible, size=size.tiny)
plotshape(os_reversal ? bull_signal_loc : na, title="Oversold Trend Reversal ▲", style=shape.triangleup, location=mode == mode1 ? location.absolute : mode == mode3 ? location.belowbar : location.bottom, color=bearcol, text='', textcolor=invisible, size=size.tiny)
plotshape(overbought ? bear_signal_loc : na, title="Overbought Trend Warning ■", style=shape.square, location=mode == mode1 ? location.absolute : mode == mode3 ? location.abovebar : location.top, color=bearcol_medium, text='', textcolor=invisible, size=size.tiny)
plotshape(oversold ? bull_signal_loc : na, title="Oversold Trend Warning ■", style=shape.square, location=mode == mode1 ? location.absolute : mode == mode3 ? location.belowbar : location.bottom, color=bullcol_medium, text='', textcolor=invisible, size=size.tiny)
plotshape(zero_long and plot_zero_crosses ? bear_signal_loc : na, title="Zero Cross Long", style=shape.triangleup, location=mode == mode1 ? location.absolute : mode == mode3 ? location.abovebar : location.top, color=color.yellow, text='', textcolor=invisible, size=size.tiny)
plotshape(zero_short and plot_zero_crosses ? bull_signal_loc : na, title="Zero Cross Short", style=shape.triangledown, location=mode == mode1 ? location.absolute : mode == mode3 ? location.belowbar : location.bottom, color=color.yellow, text='', textcolor=invisible, size=size.tiny)
plot(not compact and plot_crosses and (cross_bull or cross_bear) ? l_percentR : na, "Crossover Dot (small)", style=plot.style_circles, color=pivotcol, linewidth=4)
plot(not compact and plot_crosses and (cross_bull or cross_bear) ? l_percentR : na, "Crossover Dot (big)", style=plot.style_circles, color=cross_bull ? bullcol_light : bearcol_light, linewidth=12)
plotchar(ob_trend_start ? bear_signal_loc : na, char="◡", color=bearcol, location=mode == mode1 ? location.absolute : mode == mode3 ? location.abovebar : location.top)
plotchar(os_trend_start ? bull_signal_loc : na, char="◠", color=bullcol, location=mode == mode1 ? location.absolute : mode == mode3 ? location.belowbar : location.bottom)
varip groupAlerts = "Alerts"
bullStartOn = input.bool(true, "Bull trend start ⏹", group=groupAlerts, inline="bullStart")
bullStartTxt = input.string("%RTE bull trend start ⏹", "", group=groupAlerts, inline="bullStart")
bearStartOn = input.bool(true, "Bear trend start ⏹", group=groupAlerts, inline="bearStart")
bearStartTxt = input.string("%RTE bear trend start ⏹", "", group=groupAlerts, inline="bearStart")
bullReversalOn = input.bool(true, "Bull trend break ▼", group=groupAlerts, inline="bullReversal")
bullReversalTxt = input.string("%RTE bull trend break ▼", "", group=groupAlerts, inline="bullReversal")
bearReversalOn = input.bool(true, "Bear trend break ▲", group=groupAlerts, inline="bearReversal")
bearReversalTxt = input.string("%RTE bear trend break ▲", "", group=groupAlerts, inline="bearReversal")
bullCrossOn = input.bool(false, "Bull cross ⏺", group=groupAlerts, inline="bullCross")
bullCrossTxt = input.string("Bullish crossover", "", group=groupAlerts, inline="bullCross")
bearCrossOn = input.bool(false, "Bear cross ⏺", group=groupAlerts, inline="bearCross")
bearCrossTxt = input.string("Bearish crossover", "", group=groupAlerts, inline="bearCross")
if (bullReversalOn and ob_reversal)
alert(message="하락전환", freq=alert.freq_once_per_bar_close)
else if (bearReversalOn and os_reversal)
alert(message="상승전환", freq=alert.freq_once_per_bar_close)
const string group_strategy = "Strategy (send external signal to TTS backtester)"
bool longDealsEnabled = input.bool(true, "Enable Long Deals", group=group_strategy)
bool shortDealsEnabled = input.bool(true, "Enable Short Deals", group=group_strategy)
strategy1 = "1 Trend Following @ Square"
strategy2 = "2 Reversal @ Square"
strategy3 = "3 Reversal Trade @ Triangle"
strategy4 = "4 Re-enter Trend Trade @ Triangle"
strategy5 = "5 Pings"
strategy6 = "6 Zero Line Cross"
strategyEntry = input.string(strategy1, "Strategy Entry", options=[strategy1, strategy2, strategy3, strategy4, strategy5, strategy6], group=group_strategy)
bool startLongDeal = false
bool startShortDeal = false
bool endLongDeal = false
bool endShortDeal = false
switch strategyEntry
strategy1 =>
if ob_trend_start and longDealsEnabled
startLongDeal := true
else if os_trend_start and shortDealsEnabled
startShortDeal := true
strategy2 =>
if os_trend_start and longDealsEnabled
startLongDeal := true
else if ob_trend_start and shortDealsEnabled
startShortDeal := true
strategy3 =>
if ob_reversal and shortDealsEnabled
startShortDeal := true
else if os_reversal and longDealsEnabled
startLongDeal := true
strategy4 =>
if os_reversal and shortDealsEnabled
startShortDeal := true
else if ob_reversal and longDealsEnabled
startLongDeal := true
strategy5 =>
if cross_bull and longDealsEnabled
startLongDeal := true
else if cross_bear and shortDealsEnabled
startShortDeal := true
strategy6 =>
if zero_long and longDealsEnabled
startLongDeal := true
else if zero_short and shortDealsEnabled
startShortDeal := true
import jason5480/external_input_utils/6 as exiu
float longChannelComp = 10.0 * (startLongDeal ? 2.0 : 0.0)
float shortChannelComp = startShortDeal ? 2.0 : 0.0
float signal = longChannelComp + shortChannelComp
bool startLongDealDec = exiu.eval_cond(signal, '/10==', 2.0)
bool startShortDealDec = exiu.eval_cond(signal, 'mod10==', 2.0)
plot(series = signal, title = '🔌Signal', color = color.olive, display = display.data_window + display.status_line)
showTF = input.bool(true, 'show time frame', inline = '24')
showpf = input.bool(true, 'show prefix', inline = '24')
showchange = input.bool(false, 'show change %', inline = '24')
string i_tableYpos = input.string('top', 'Position', inline = '12', options = ['top', 'middle', 'bottom'])
string i_tableXpos = input.string('right', '', inline = '12', options = ['left', 'center', 'right'])
size1 = input.string('normal', 'title', inline = '14', options = ['tiny', 'small', 'normal', 'large', 'huge', 'auto'])
size3 = input.string('normal', 'change', inline = '14', options = ['tiny', 'small', 'normal', 'large', 'huge', 'auto'])
size2 = input.string('normal', 'signature', inline = '14', options = ['tiny', 'small', 'normal', 'large', 'huge', 'auto'])
color = input.color(color.rgb(255, 255, 255, 12), 'color')
string = input.string('🦍차트고릴라', 'your signature')
seperator = input.string('/', 'seperator')
cahngeClose = request.security(syminfo.tickerid, timeframe.period, close)
cur = syminfo.currency
base = syminfo.basecurrency
exchange = syminfo.prefix
getTimeFrame() =>
tf = timeframe.multiplier
tfstr = ''
if timeframe.isseconds
tfstr := 's'
tfstr
if timeframe.isminutes
if tf >= 60
tf := tf / 60
tfstr := 'h'
tfstr
else
tfstr := 'm'
tfstr
if timeframe.isdaily
tfstr := 'D'
tfstr
if timeframe.isweekly
tfstr := 'W'
tfstr
if timeframe.ismonthly
tfstr := 'M'
tfstr
[tfstr, str.tostring(tf)]
var table table1 = table.new(i_tableYpos + '_' + i_tableXpos, 4, 1)
if barstate.islast
str1 = base != '' ? base + seperator + cur : syminfo.ticker
[tf, period] = getTimeFrame()
change = math.round((cahngeClose[0] / cahngeClose[1] - 1) * 100, 2)
changeStr = ''
if change > 0
changeStr := '▲' + str.tostring(math.abs(change)) + '%'
changeStr
else
changeStr := '▼' + str.tostring(math.abs(change)) + '%'
changeStr
table.cell(table1, 0, 0, showpf ? exchange : '', text_color = color, width = 0, text_size = size2)
table.cell(table1, 1, 0, str1 + (showTF ? ' ' + period + tf : ''), width = 0, text_color = color, text_size = size1)
table.cell(table1, 3, 0, showchange ? changeStr : '', width = 0, text_color = change > 0 ? color.green : color.red, text_size = size3)
table.cell(table1, 2, 0, string, text_color = color, width = 0, text_size = size3)