커뮤니티

트레이딩뷰 수식 변경 요청드립니다.

프로필 이미지
jaylee
2024-01-18 22:45:59
1022
글번호 175884
답변완료
안녕하세요. 트레이딩뷰 수식 변경 요청드립니다. 감사합니다~ //@version=5 indicator("Multi Kernel Regression [ChartPrime]", overlay = true, max_lines_count = 500, max_bars_back = 500, max_labels_count = 500) repaint = input.bool(true, "Repaint") kernel = input.string("Laplace", [ "Triangular" , "Gaussian" , "Epanechnikov" , "Logistic" , "Log Logistic" , "Cosine" , "Sinc" , "Laplace" , "Quartic" , "Parabolic" , "Exponential" , "Silverman" , "Cauchy" , "Tent" , "Wave" , "Power" , "Morters"]) bandwidth = input.int(14, 'Bandwidth', 1) source = input.source(close, 'Source') deviations = input.float(2.0, 'Deviation', 0, 100, 0.25, inline = "dev") style = input.string("Solid", "Line Style", ["Solid", "Dotted", "Dashed"]) enable = input.bool(false, "", inline = "dev") label_size = input.string("Tiny", "Labels", ["Auto", "Tiny", "Small", "Normal", "Large", "Huge"], inline = "label") lables = input.bool(true, "", inline = "label") bullish_color = input.color(color.rgb(84, 194, 148), "Colors", inline = "color") bearish_color = input.color(color.rgb(235, 57, 57), "", inline = "color") text_color = input.color(color.rgb(8, 12, 20), "", inline = "color") size = switch label_size "Auto" => size.auto "Tiny" => size.tiny "Small" => size.small "Normal" => size.normal "Large" => size.large "Huge" => size.huge line_style = switch style "Solid" => line.style_solid "Dotted" => line.style_dotted "Dashed" => line.style_dashed sq(source) => math.pow(source, 2) gaussian(source, bandwidth) => math.exp(-sq(source / bandwidth) / 2) / math.sqrt(2 * math.pi) triangular(source, bandwidth) => math.abs(source/bandwidth) <= 1 ? 1 - math.abs(source/bandwidth) : 0.0 epanechnikov(source, bandwidth) => math.abs(source/bandwidth) <= 1 ? (3/4.) * (1 - sq(source/bandwidth)) : 0.0 quartic(source, bandwidth) => if math.abs(source/bandwidth) <= 1 15/16. * math.pow(1 - sq(source/bandwidth), 2) else 0.0 logistic(source, bandwidth) => 1 / (math.exp(source / bandwidth) + 2 + math.exp(-source / bandwidth)) cosine(source, bandwidth) => math.abs(source/bandwidth) <= 1 ? (math.pi / 4) * math.cos((math.pi / 2) * (source/bandwidth)) : 0.0 laplace(source, bandwidth) => (1 / (2 * bandwidth)) * math.exp(-math.abs(source/bandwidth)) exponential(source, bandwidth) => (1 / bandwidth) * math.exp(-math.abs(source/bandwidth)) silverman(source, bandwidth) => if math.abs(source/bandwidth) <= 0.5 0.5 * math.exp(-(source/bandwidth)/2) * math.sin((source/bandwidth)/2 + math.pi/4) else 0.0 tent(source, bandwidth) => if math.abs(source/bandwidth) <= 1 1 - math.abs(source/bandwidth) else 0.0 cauchy(source, bandwidth) => 1 / (math.pi * bandwidth * (1 + sq(source / bandwidth))) sinc(source, bandwidth) => if source == 0 1 else math.sin(math.pi * source / bandwidth) / (math.pi * source / bandwidth) wave(source, bandwidth) => if (math.abs(source/bandwidth) <= 1) (1 - math.abs(source/bandwidth)) * math.cos((math.pi * source) / bandwidth) else 0.0 parabolic(source, bandwidth) => if math.abs(source/bandwidth) <= 1 1 - math.pow((source/bandwidth), 2) else 0.0 power(source, bandwidth) => if (math.abs(source/bandwidth) <= 1) math.pow(1 - math.pow(math.abs(source/bandwidth), 3), 3) else 0.0 loglogistic(source, bandwidth) => 1 / math.pow(1 + math.abs(source / bandwidth), 2) morters(source, bandwidth) => if math.abs(source / bandwidth) <= math.pi (1 + math.cos(source / bandwidth)) / (2 * math.pi * bandwidth) else 0.0 kernel(source, bandwidth, style)=> switch style "Triangular" => triangular(source, bandwidth) "Gaussian" => gaussian(source, bandwidth) "Epanechnikov" => epanechnikov(source, bandwidth) "Logistic" => logistic(source, bandwidth) "Log Logistic" => loglogistic(source, bandwidth) "Cosine" => cosine(source, bandwidth) "Sinc" => sinc(source, bandwidth) "Laplace" => laplace(source, bandwidth) "Quartic" => quartic(source, bandwidth) "Parabolic" => parabolic(source, bandwidth) "Exponential" => exponential(source, bandwidth) "Silverman" => silverman(source, bandwidth) "Cauchy" => cauchy(source, bandwidth) "Tent" => tent(source, bandwidth) "Wave" => wave(source, bandwidth) "Power" => power(source, bandwidth) "Morters" => morters(source, bandwidth) multi_kernel_regression(source, bandwidth, deviations, style, lables, enable, line_style, text_color, bullish_color, bearish_color, size, repaint)=> var estimate_array = array.new<line>(501, line.new(na, na, na, na)) var dev_upper_array = array.new<line>(501, line.new(na, na, na, na)) var dev_lower_array = array.new<line>(501, line.new(na, na, na, na)) var up_labels = array.new<label>(501, label.new(na, na)) var down_labels = array.new<label>(501, label.new(na, na)) float current_price = na float previous_price = na float previous_price_delta = na float std_dev = na float upper_1 = na float lower_1 = na float upper_2 = na float lower_2 = na line estimate = na line dev_upper = na line dev_lower = na label bullish = na label bearish = na if not repaint float sum = 0.0 float sumw = 0.0 float sumsq = 0.0 for i = 0 to bandwidth - 1 j = math.pow(i, 2) / (math.pow(bandwidth, 2)) weight = kernel(j, 1, style) sum += source[i] * weight sumw += weight mean = sum / sumw direction = mean - mean[1] > 0 direction_color = direction ? bullish_color : bearish_color for i = 0 to bandwidth - 1 sumsq += math.pow(source[i] - mean[i], 2) stdev = math.sqrt(sumsq / (bandwidth - 1)) * deviations array.unshift(estimate_array, line.new(bar_index, mean, bar_index - 1, mean[1], xloc.bar_index, extend.none, direction_color, line_style, 3)) if enable array.unshift(dev_upper_array, line.new(bar_index, mean + stdev, bar_index - 1, mean[1] + stdev[1], xloc.bar_index, extend.none, direction_color, line_style, 3)) array.unshift(dev_lower_array, line.new(bar_index, mean - stdev, bar_index - 1, mean[1] - stdev[1], xloc.bar_index, extend.none, direction_color, line_style, 3)) if lables if direction and not direction[1] array.unshift(up_labels, label.new(bar_index, source, "Up", yloc = yloc.belowbar, color = bullish_color, style = label.style_label_up, textcolor = text_color, size = size)) if not direction and direction[1] array.unshift(down_labels, label.new(bar_index, source, "Down", yloc = yloc.abovebar, color = bearish_color, style = label.style_label_down, textcolor = text_color, size = size)) else if barstate.isfirst for i = 500 to 0 array.set(estimate_array, i, line.new(na, na, na, na)) if enable array.set(dev_upper_array, i, line.new(na, na, na, na)) array.set(dev_lower_array, i, line.new(na, na, na, na)) if lables array.set(up_labels, i, label.new(na, na)) array.set(down_labels,i, label.new(na, na)) if barstate.islast for i = 0 to math.min(bar_index - 1, 500) float sum = 0 float sumw = 0 float sumsq = 0 for j = 0 to math.min(bar_index - 1, 500) diff = i - j weight = kernel(diff, bandwidth, kernel) sum += source[j] * weight sumsq += sq(source[j]) * weight sumw += weight current_price := sum / sumw delta = current_price - previous_price if enable std_dev := math.sqrt(math.max(sumsq / sumw - sq(current_price), 0)) upper_2 := current_price + deviations * std_dev lower_2 := current_price - deviations * std_dev estimate := array.get(estimate_array, i) if enable dev_upper := array.get(dev_upper_array, i) dev_lower := array.get(dev_lower_array, i) line.set_xy1(estimate, bar_index - i + 1, previous_price) line.set_xy2(estimate, bar_index - i, current_price) line.set_style(estimate, line_style) line.set_color(estimate, current_price > previous_price ? bearish_color : bullish_color) line.set_width(estimate, 3) if enable line.set_xy1(dev_upper, bar_index - i + 1, upper_1) line.set_xy2(dev_upper, bar_index - i , upper_2) line.set_style(dev_upper, line_style) line.set_color(dev_upper, current_price > previous_price ? bearish_color : bullish_color) line.set_width(dev_upper, 3) line.set_xy1(dev_lower, bar_index - i + 1, lower_1) line.set_xy2(dev_lower, bar_index - i , lower_2) line.set_style(dev_lower, line_style) line.set_color(dev_lower, current_price > previous_price ? bearish_color : bullish_color) line.set_width(dev_lower, 3) if lables bullish := array.get(up_labels, i) bearish := array.get(down_labels, i) if delta > 0 and previous_price_delta < 0 label.set_xy(bullish, bar_index - i + 1, source[i]) label.set_text(bullish, 'Up') label.set_color(bullish, bullish_color) label.set_textcolor(bullish, text_color) label.set_textalign(bullish, text.align_center) label.set_size(bullish, size) label.set_style(bullish, label.style_label_up) label.set_yloc(bullish, yloc.belowbar) if delta < 0 and previous_price_delta > 0 label.set_xy(bearish, bar_index - i + 1, source[i]) label.set_text(bearish, 'Down') label.set_textcolor(bearish, text_color) label.set_color(bearish, bearish_color) label.set_textalign(bearish, text.align_center) label.set_size(bearish, size) label.set_style(bearish, label.style_label_down) label.set_yloc(bearish, yloc.abovebar) previous_price := current_price upper_1 := upper_2 lower_1 := lower_2 previous_price_delta := delta if barstate.isconfirmed for i = array.size(up_labels) - 1 to 0 label.set_xy(array.get(up_labels, i), na, na) for i = array.size(down_labels) - 1 to 0 label.set_xy(array.get(down_labels, i), na, na) multi_kernel_regression(source, bandwidth, deviations, kernel, lables, enable, line_style, text_color, bullish_color, bearish_color, size, repaint)
사용자 함수
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2024-01-19 09:33:25

안녕하세요 예스스탁입니다. 올려주신 내용은 답변이 어렵습니다. 업무상 일정시간이상 요구되는 내용은 저희가 작성을 해드리지 않습니다. 도움을 드리지 못해 죄송합니다. 즐거운 하루되세요 > jaylee 님이 쓴 글입니다. > 제목 : 트레이딩뷰 수식 변경 요청드립니다. > 안녕하세요. 트레이딩뷰 수식 변경 요청드립니다. 감사합니다~ //@version=5 indicator("Multi Kernel Regression [ChartPrime]", overlay = true, max_lines_count = 500, max_bars_back = 500, max_labels_count = 500) repaint = input.bool(true, "Repaint") kernel = input.string("Laplace", [ "Triangular" , "Gaussian" , "Epanechnikov" , "Logistic" , "Log Logistic" , "Cosine" , "Sinc" , "Laplace" , "Quartic" , "Parabolic" , "Exponential" , "Silverman" , "Cauchy" , "Tent" , "Wave" , "Power" , "Morters"]) bandwidth = input.int(14, 'Bandwidth', 1) source = input.source(close, 'Source') deviations = input.float(2.0, 'Deviation', 0, 100, 0.25, inline = "dev") style = input.string("Solid", "Line Style", ["Solid", "Dotted", "Dashed"]) enable = input.bool(false, "", inline = "dev") label_size = input.string("Tiny", "Labels", ["Auto", "Tiny", "Small", "Normal", "Large", "Huge"], inline = "label") lables = input.bool(true, "", inline = "label") bullish_color = input.color(color.rgb(84, 194, 148), "Colors", inline = "color") bearish_color = input.color(color.rgb(235, 57, 57), "", inline = "color") text_color = input.color(color.rgb(8, 12, 20), "", inline = "color") size = switch label_size "Auto" => size.auto "Tiny" => size.tiny "Small" => size.small "Normal" => size.normal "Large" => size.large "Huge" => size.huge line_style = switch style "Solid" => line.style_solid "Dotted" => line.style_dotted "Dashed" => line.style_dashed sq(source) => math.pow(source, 2) gaussian(source, bandwidth) => math.exp(-sq(source / bandwidth) / 2) / math.sqrt(2 * math.pi) triangular(source, bandwidth) => math.abs(source/bandwidth) <= 1 ? 1 - math.abs(source/bandwidth) : 0.0 epanechnikov(source, bandwidth) => math.abs(source/bandwidth) <= 1 ? (3/4.) * (1 - sq(source/bandwidth)) : 0.0 quartic(source, bandwidth) => if math.abs(source/bandwidth) <= 1 15/16. * math.pow(1 - sq(source/bandwidth), 2) else 0.0 logistic(source, bandwidth) => 1 / (math.exp(source / bandwidth) + 2 + math.exp(-source / bandwidth)) cosine(source, bandwidth) => math.abs(source/bandwidth) <= 1 ? (math.pi / 4) * math.cos((math.pi / 2) * (source/bandwidth)) : 0.0 laplace(source, bandwidth) => (1 / (2 * bandwidth)) * math.exp(-math.abs(source/bandwidth)) exponential(source, bandwidth) => (1 / bandwidth) * math.exp(-math.abs(source/bandwidth)) silverman(source, bandwidth) => if math.abs(source/bandwidth) <= 0.5 0.5 * math.exp(-(source/bandwidth)/2) * math.sin((source/bandwidth)/2 + math.pi/4) else 0.0 tent(source, bandwidth) => if math.abs(source/bandwidth) <= 1 1 - math.abs(source/bandwidth) else 0.0 cauchy(source, bandwidth) => 1 / (math.pi * bandwidth * (1 + sq(source / bandwidth))) sinc(source, bandwidth) => if source == 0 1 else math.sin(math.pi * source / bandwidth) / (math.pi * source / bandwidth) wave(source, bandwidth) => if (math.abs(source/bandwidth) <= 1) (1 - math.abs(source/bandwidth)) * math.cos((math.pi * source) / bandwidth) else 0.0 parabolic(source, bandwidth) => if math.abs(source/bandwidth) <= 1 1 - math.pow((source/bandwidth), 2) else 0.0 power(source, bandwidth) => if (math.abs(source/bandwidth) <= 1) math.pow(1 - math.pow(math.abs(source/bandwidth), 3), 3) else 0.0 loglogistic(source, bandwidth) => 1 / math.pow(1 + math.abs(source / bandwidth), 2) morters(source, bandwidth) => if math.abs(source / bandwidth) <= math.pi (1 + math.cos(source / bandwidth)) / (2 * math.pi * bandwidth) else 0.0 kernel(source, bandwidth, style)=> switch style "Triangular" => triangular(source, bandwidth) "Gaussian" => gaussian(source, bandwidth) "Epanechnikov" => epanechnikov(source, bandwidth) "Logistic" => logistic(source, bandwidth) "Log Logistic" => loglogistic(source, bandwidth) "Cosine" => cosine(source, bandwidth) "Sinc" => sinc(source, bandwidth) "Laplace" => laplace(source, bandwidth) "Quartic" => quartic(source, bandwidth) "Parabolic" => parabolic(source, bandwidth) "Exponential" => exponential(source, bandwidth) "Silverman" => silverman(source, bandwidth) "Cauchy" => cauchy(source, bandwidth) "Tent" => tent(source, bandwidth) "Wave" => wave(source, bandwidth) "Power" => power(source, bandwidth) "Morters" => morters(source, bandwidth) multi_kernel_regression(source, bandwidth, deviations, style, lables, enable, line_style, text_color, bullish_color, bearish_color, size, repaint)=> var estimate_array = array.new<line>(501, line.new(na, na, na, na)) var dev_upper_array = array.new<line>(501, line.new(na, na, na, na)) var dev_lower_array = array.new<line>(501, line.new(na, na, na, na)) var up_labels = array.new<label>(501, label.new(na, na)) var down_labels = array.new<label>(501, label.new(na, na)) float current_price = na float previous_price = na float previous_price_delta = na float std_dev = na float upper_1 = na float lower_1 = na float upper_2 = na float lower_2 = na line estimate = na line dev_upper = na line dev_lower = na label bullish = na label bearish = na if not repaint float sum = 0.0 float sumw = 0.0 float sumsq = 0.0 for i = 0 to bandwidth - 1 j = math.pow(i, 2) / (math.pow(bandwidth, 2)) weight = kernel(j, 1, style) sum += source[i] * weight sumw += weight mean = sum / sumw direction = mean - mean[1] > 0 direction_color = direction ? bullish_color : bearish_color for i = 0 to bandwidth - 1 sumsq += math.pow(source[i] - mean[i], 2) stdev = math.sqrt(sumsq / (bandwidth - 1)) * deviations array.unshift(estimate_array, line.new(bar_index, mean, bar_index - 1, mean[1], xloc.bar_index, extend.none, direction_color, line_style, 3)) if enable array.unshift(dev_upper_array, line.new(bar_index, mean + stdev, bar_index - 1, mean[1] + stdev[1], xloc.bar_index, extend.none, direction_color, line_style, 3)) array.unshift(dev_lower_array, line.new(bar_index, mean - stdev, bar_index - 1, mean[1] - stdev[1], xloc.bar_index, extend.none, direction_color, line_style, 3)) if lables if direction and not direction[1] array.unshift(up_labels, label.new(bar_index, source, "Up", yloc = yloc.belowbar, color = bullish_color, style = label.style_label_up, textcolor = text_color, size = size)) if not direction and direction[1] array.unshift(down_labels, label.new(bar_index, source, "Down", yloc = yloc.abovebar, color = bearish_color, style = label.style_label_down, textcolor = text_color, size = size)) else if barstate.isfirst for i = 500 to 0 array.set(estimate_array, i, line.new(na, na, na, na)) if enable array.set(dev_upper_array, i, line.new(na, na, na, na)) array.set(dev_lower_array, i, line.new(na, na, na, na)) if lables array.set(up_labels, i, label.new(na, na)) array.set(down_labels,i, label.new(na, na)) if barstate.islast for i = 0 to math.min(bar_index - 1, 500) float sum = 0 float sumw = 0 float sumsq = 0 for j = 0 to math.min(bar_index - 1, 500) diff = i - j weight = kernel(diff, bandwidth, kernel) sum += source[j] * weight sumsq += sq(source[j]) * weight sumw += weight current_price := sum / sumw delta = current_price - previous_price if enable std_dev := math.sqrt(math.max(sumsq / sumw - sq(current_price), 0)) upper_2 := current_price + deviations * std_dev lower_2 := current_price - deviations * std_dev estimate := array.get(estimate_array, i) if enable dev_upper := array.get(dev_upper_array, i) dev_lower := array.get(dev_lower_array, i) line.set_xy1(estimate, bar_index - i + 1, previous_price) line.set_xy2(estimate, bar_index - i, current_price) line.set_style(estimate, line_style) line.set_color(estimate, current_price > previous_price ? bearish_color : bullish_color) line.set_width(estimate, 3) if enable line.set_xy1(dev_upper, bar_index - i + 1, upper_1) line.set_xy2(dev_upper, bar_index - i , upper_2) line.set_style(dev_upper, line_style) line.set_color(dev_upper, current_price > previous_price ? bearish_color : bullish_color) line.set_width(dev_upper, 3) line.set_xy1(dev_lower, bar_index - i + 1, lower_1) line.set_xy2(dev_lower, bar_index - i , lower_2) line.set_style(dev_lower, line_style) line.set_color(dev_lower, current_price > previous_price ? bearish_color : bullish_color) line.set_width(dev_lower, 3) if lables bullish := array.get(up_labels, i) bearish := array.get(down_labels, i) if delta > 0 and previous_price_delta < 0 label.set_xy(bullish, bar_index - i + 1, source[i]) label.set_text(bullish, 'Up') label.set_color(bullish, bullish_color) label.set_textcolor(bullish, text_color) label.set_textalign(bullish, text.align_center) label.set_size(bullish, size) label.set_style(bullish, label.style_label_up) label.set_yloc(bullish, yloc.belowbar) if delta < 0 and previous_price_delta > 0 label.set_xy(bearish, bar_index - i + 1, source[i]) label.set_text(bearish, 'Down') label.set_textcolor(bearish, text_color) label.set_color(bearish, bearish_color) label.set_textalign(bearish, text.align_center) label.set_size(bearish, size) label.set_style(bearish, label.style_label_down) label.set_yloc(bearish, yloc.abovebar) previous_price := current_price upper_1 := upper_2 lower_1 := lower_2 previous_price_delta := delta if barstate.isconfirmed for i = array.size(up_labels) - 1 to 0 label.set_xy(array.get(up_labels, i), na, na) for i = array.size(down_labels) - 1 to 0 label.set_xy(array.get(down_labels, i), na, na) multi_kernel_regression(source, bandwidth, deviations, kernel, lables, enable, line_style, text_color, bullish_color, bearish_color, size, repaint)