답변완료
문의
indicator('Consolidation Range with Signals (Zeiierman)', overlay=true, max_labels_count = 500, max_lines_count = 500) //~~}// ~~ Tooltips { var string t1 = "Select the method used for detecting ranging market conditions.\n\n ADX: Uses the Average Directional Index to identify non-trending periods when ADX is below a set threshold.\n\n Volatility: Detects ranges by identifying periods of compression in volatility using standard deviation, variance, and ATR filters.\n\n Price Action: Confirms range by measuring the high-low percentage contraction and requiring a minimum number of DMI crosses, suggesting indecision or balance in price action." var string t2 = "Length or period used for detecting the range." var string t3 = "Multiplier applied to the calculated band distance." var string t4 = "Toggle to display Take Profit and Stop Loss levels on the chart." var string t5 = "Minimum number of bars between two consecutive SL/TP entries." var string t6 = "Stop Loss multiplier from the filtered base value." var string t7 = "Take Profit 1 multiplier from the filtered base value." var string t8 = "Take Profit 2 multiplier from the filtered base value." var string t9 = "Take Profit 3 multiplier from the filtered base value." var string t10 = "ADX threshold under which the market is considered ranging." var string t11 = "Smoothing period used for the ADX calculation." var string t12 = "Standard deviation compression threshold used to detect low volatility." var string t13 = "Variance compression threshold used to detect low volatility." var string t14 = "ATR compression threshold used to detect low volatility." //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ Inputs { // ~~ Range { method = input.string("ADX", options=["ADX", "Volatility"], title="Range Detection Method", group="Range Detection", tooltip=t1) len = input.int(10, minval=2, title="Range Period", group="Range Detection", tooltip=t2) band_mult = input.float(1.8, step=0.1, minval=0.01,title="Range Multiplier", group="Range Detection", tooltip=t3) upper_col = input.color(#0060e6, title="Range", group="Range Detection", inline="bandcol") lower_col = input.color(#29fafa, title="", group="Range Detection", inline="bandcol") pos_col = input.color(#0060e6, title="Trend", group="Range Detection", inline="trendcol") neg_col = input.color(#29fafa, title="", group="Range Detection", inline="trendcol") //~~} // ~~ SL/TP { showTP = input.bool(true, title="Show SL/TP Levels", group="Targets", tooltip=t4) cooldown = input.int(20, title="SL/TP Cooldown (Bars)", group="Targets", tooltip=t5) sl_mult = input.float(0.4, step=0.1, minval=0.01,title="SL", group="Targets", inline="sl", tooltip=t6) showsl = input.bool(true, title="", group="Targets", inline="sl", tooltip=t6) tp1_mult = input.float(0.5, step=0.1, minval=0.01,title="TP1", group="Targets", inline="tp1", tooltip=t7) showtp1 = input.bool(true, title="", group="Targets", inline="tp1", tooltip=t7) tp2_mult = input.float(1.0, step=0.1, minval=0.01,title="TP2", group="Targets", inline="tp2", tooltip=t8) showtp2 = input.bool(false, title="", group="Targets", inline="tp2", tooltip=t8) tp3_mult = input.float(2.0, step=0.1, minval=0.01,title="TP3", group="Targets", inline="tp3", tooltip=t9) showtp3 = input.bool(false, title="", group="Targets", inline="tp3", tooltip=t9)entry_col = input.color(color.blue, title="Entry", group="Targets", inline="tpcol") sl_col = input.color(#ff0000, title="SL", group="Targets", inline="tpcol") bullColor = input.color(#09c10f, title="TP", group="Targets", inline="tpcol") bearColor = input.color(#ff69cb, title="", group="Targets", inline="tpcol") //~~} // ~~ ADX { adx_thresh = input.int(17, step=1, minval=0,title="ADX Threshold", group="ADX", tooltip=t10) adx_smooth = input.int(10, step=1, minval=0,title="ADX Smoothing", group="ADX", tooltip=t11) //~~} // ~~ Volatility { vol_mult_std = input.float(0.8, step=0.1, minval=0.001, title="StdDev Multiplier", group="Volatility", tooltip=t12) vol_mult_var = input.float(0.8, step=0.1, minval=0.001,title="Variance Multiplier", group="Volatility", tooltip=t13) vol_mult_atr = input.float(0.9, step=0.1, minval=0.001,title="ATR Multiplier", group="Volatility", tooltip=t14) //~~} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ ADX { [_, _, adx] = ta.dmi(len, adx_smooth) isADX = adx < adx_thresh //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ Volatility Compression { logret = math.log(close / close[1]) std_now = ta.stdev(logret, len) std_avg = ta.sma(std_now, len) atr_now = ta.atr(len) atr_avg = ta.sma(atr_now, len) var_now = ta.variance(logret, len) var_avg = ta.sma(var_now, len) isVolatility = std_now < std_avg * vol_mult_std and var_now < var_avg * vol_mult_var and atr_now < atr_avg * vol_mult_atr //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ Switch { methodDetected = (method == "ADX" and isADX) or (method == "Volatility" and isVolatility) //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ Var { var float rngfilt = close var color trendColor = na var bool rangeVisible = false var float prev_hi = na var float prev_lo = na var int rangeStartBar = na var int rangeBarsActive = 0 var int lastBreakoutBar = naif methodDetected and na(rangeStartBar) rangeStartBar := bar_index else if not methodDetected rangeStartBar := naif methodDetected rangeVisible := true //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ Range Calculation { diff = math.abs(high - low[1]) r = ta.sma(2.618 * diff, 2000) * band_mult //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ Range Calculation Functions { pricejump(prev) => highJump = prev + math.abs(close - prev) / r * r lowJump = prev - math.abs(close - prev) / r * r [highJump, lowJump]rangefilter(hhjump, lljump, prev) => hhBreak = close > prev hhTooClose = close - r < prev hhShift = close - r llTooClose = close + r > prev llShift = close + r step1 = hhBreak ? (hhTooClose ? prev : hhShift) : (llTooClose ? prev : llShift) hhAbove = close >= prev + r llBelow = close <= prev - r hhAbove ? hhjump : llBelow ? lljump : step1bands(filt) => [filt + r, filt - r] trenddir(filt) => [filt > nz(filt[1]), filt < nz(filt[1])] trendcomp(filt) => [filt, ta.sma(filt, 2), ta.sma(filt, 4)]prev = nz(rngfilt[1]) [hhJ, llJ] = pricejump(prev) rngfilt := rangefilter(hhJ, llJ, prev) prev_rngfilt = nz(rngfilt[1]) rngfilt_step_up = rngfilt > prev_rngfilt rngfilt_step_down = rngfilt < prev_rngfilt[hiband, loband] = bands(rngfilt) [up, down] = trenddir(rngfilt) [TrendFast, TrendMed, TrendLong] = trendcomp(rngfilt)if methodDetected prev_hi := hiband prev_lo := lobandif not methodDetected and (close[1] > prev_hi or close[1] < prev_lo) rangeVisible := falseMIDX1 = (hiband - rngfilt) / 3 MID1 = rngfilt + MIDX1 MID2 = MID1 + MIDX1 MIDX2 = (rngfilt - loband) / 3 MID3 = rngfilt - MIDX2 MID4 = MID3 - MIDX2 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ Plot { trendColor := up ? pos_col : down ? neg_col : trendColor[1] plotTrend = plot(rangeVisible ? TrendFast : close, "Trend", rangeVisible ? trendColor:color.new(trendColor,100), 1)plotMid1 = plot(rangeVisible ? MID1 : close, "MID1", rangeVisible ?color.new(upper_col, 50):color.new(upper_col, 100), style= plot.style_stepline) plotMid2 = plot(rangeVisible ? MID2 : close, "MID2", rangeVisible ?color.new(upper_col, 50):color.new(upper_col, 100), style= plot.style_stepline) plotMid3 = plot(rangeVisible ? MID3 : close, "MID3", rangeVisible ?color.new(lower_col, 50):color.new(lower_col, 100), style= plot.style_stepline) plotMid4 = plot(rangeVisible ? MID4 : close, "MID4", rangeVisible ?color.new(lower_col, 50):color.new(lower_col, 100), style= plot.style_stepline) fill(plotMid2, plotTrend, MID2, TrendFast, color.new(upper_col, 60),na) fill(plotMid4, plotTrend, MID4, TrendFast, color.new(lower_col, 60),na) //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}// ~~ TP and SL { rangeBarsActive := na(rangeStartBar) ? 0 : bar_index - rangeStartBar canTriggerBreakout = (na(lastBreakoutBar) or bar_index - lastBreakoutBar >= cooldown) enterLong = rangeVisible and rngfilt_step_up and canTriggerBreakout enterShort = rangeVisible and rngfilt_step_down and canTriggerBreakoutcalcSLTP(isLong) => base = rngfilt offset = r * sl_mult tp1off = r * tp1_mult tp2off = r * tp2_mult tp3off = r * tp3_mult stop_ = isLong ? base - offset : base + offset tp1_ = isLong ? base + tp1off : base - tp1off tp2_ = isLong ? base + tp2off : base - tp2off tp3_ = isLong ? base + tp3off : base - tp3off [stop_, tp1_, tp2_, tp3_]drawLevels(entry, sl, tp1, tp2, tp3, col) => if showTP line.new(bar_index, entry, bar_index + 20, entry, color=entry_col, width=2) if showsl line.new(bar_index, sl, bar_index + 20, sl, color=color.new(sl_col, 0), width=2) if showtp1 line.new(bar_index, tp1, bar_index + 20, tp1, color=color.new(col, 0), width=2) if showtp2 line.new(bar_index, tp2, bar_index + 20, tp2, color=color.new(col, 0), width=2) if showtp3 line.new(bar_index, tp3, bar_index + 20, tp3, color=color.new(col, 0), width=2) if showTP label.new(bar_index+ 20, entry, "Entry", style=label.style_label_left, color=entry_col, textcolor=color.white, size = size.tiny) if showsl label.new(bar_index+ 20, sl, "SL", style=label.style_label_left, color=color.new(sl_col, 0), textcolor=color.white, size = size.tiny) if showtp1 label.new(bar_index+ 20, tp1, "TP 1", style=label.style_label_left, color=color.new(col, 0), textcolor=color.white, size = size.tiny) if showtp2 label.new(bar_index+ 20, tp2, "TP 2", style=label.style_label_left, color=color.new(col, 0), textcolor=color.white, size = size.tiny) if showtp3 label.new(bar_index+ 20, tp3, "TP 3", style=label.style_label_left, color=color.new(col, 0), textcolor=color.white, size = size.tiny)var float SL = na var float TP1 = na var float TP2 = na var float TP3 = naif enterLong and showTP and (na(lastBreakoutBar) or bar_index - lastBreakoutBar >= cooldown) [s, t1_, t2_, t3_] = calcSLTP(true) SL := s, TP1 := t1_, TP2 := t2_, TP3 := t3_ drawLevels(close, SL, TP1, TP2, TP3, bullColor) lastBreakoutBar := bar_indexif enterShort and showTP and (na(lastBreakoutBar) or bar_index - lastBreakoutBar >= cooldown) [s, t1_, t2_, t3_] = calcSLTP(false) SL := s, TP1 := t1_, TP2 := t2_, TP3 := t3_ drawLevels(close, SL, TP1, TP2, TP3, bearColor) lastBreakoutBar := bar_index //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~} 예스로 부탁드립니다
2025-10-27
112
글번호 227326
지표
답변완료
조건검색 문의
//@version=5 indicator("Middle Line Breakout from RSI Shift Zone", overlay=true)// --------------------------------------------------------------------------------------------------------------------{ // Middle Line Calculation from RSI Shift Zone rsi_len = input.int(14, "RSI length") upper_level = input.int(70, "Upper RSI Level", minval = 50) lower_level = input.int(30, "Lower RSI Level", maxval = 50) min_channel_len = input.int(15, "Minimal bars length of the channel")var start = int(na) var trigger = false var float upper = na var float lower = na var channel_color = color(na)rsi = ta.rsi(close, rsi_len)channel_upper = ta.crossover(rsi, upper_level) and not trigger channel_lower = ta.crossunder(rsi, lower_level) and not triggerif channel_upper or channel_lower start := bar_index trigger := true upper := high lower := lowif bar_index-start >= min_channel_len trigger := falsetrigger_change = channel_upper != channel_upper[1] or channel_lower != channel_lower[1]// Middle Line Calculation middle_line = trigger_change ? na : math.avg(upper, lower) // --------------------------------------------------------------------------------------------------------------------}// --------------------------------------------------------------------------------------------------------------------{ // Middle Line Breakout Signals middle_line_breakout_up = ta.crossover(close, middle_line) middle_line_breakout_down = ta.crossunder(close, middle_line)// Plot Middle Line plot(middle_line, "Middle Line", color=color.blue, linewidth=2)// Plot Breakout Signals plotshape(middle_line_breakout_up, "Breakout Up", shape.triangleup, location.belowbar, color=color.green, size=size.small) plotshape(middle_line_breakout_down, "Breakout Down", shape.triangledown, location.abovebar, color=color.red, size=size.small)// Alerts alertcondition(middle_line_breakout_up, "Middle Line Breakout Up", "Middle Line Bullish Breakout") alertcondition(middle_line_breakout_down, "Middle Line Breakout Down", "Middle Line Bearish Breakout") // --------------------------------------------------------------------------------------------------------------------}위 트뷰 신호 스크립트를 예스트레이더 검색기로 만들어 주시면 감사드리겠습니다 (__)2번째 트뷰 스크립트 신호 요청 식 //@version=5indicator("Upper Line from RSI Shift Zone", overlay=true)// --------------------------------------------------------------------------------------------------------------------{// Upper Line Calculation from RSI Shift Zonersi_len = input.int(14, "RSI length")upper_level = input.int(70, "Upper RSI Level", minval = 50)lower_level = input.int(30, "Lower RSI Level", maxval = 50)min_channel_len = input.int(15, "Minimal bars length of the channel")var start = int(na)var trigger = falsevar float upper = navar float lower = navar channel_color = color(na)rsi = ta.rsi(close, rsi_len)channel_upper = ta.crossover(rsi, upper_level) and not triggerchannel_lower = ta.crossunder(rsi, lower_level) and not triggerif channel_upper or channel_lower start := bar_index trigger := true upper := high lower := lowif bar_index-start >= min_channel_len trigger := falsetrigger_change = channel_upper != channel_upper[1] or channel_lower != channel_lower[1]// Upper Line Calculationupper_line = trigger_change ? na : upper// --------------------------------------------------------------------------------------------------------------------}// --------------------------------------------------------------------------------------------------------------------{// Upper Line Breakout Signalsupper_line_breakout_up = ta.crossover(close, upper_line)upper_line_breakout_down = ta.crossunder(close, upper_line)// Plot Upper Lineplot(upper_line, "Upper Line", color=color.red, linewidth=2)// Plot Breakout Signalsplotshape(upper_line_breakout_up, "Upper Breakout Up", shape.triangleup, location.belowbar, color=color.green, size=size.small)plotshape(upper_line_breakout_down, "Upper Breakout Down", shape.triangledown, location.abovebar, color=color.red, size=size.small)// Alertsalertcondition(upper_line_breakout_up, "Upper Line Breakout Up", "Upper Line Bullish Breakout")alertcondition(upper_line_breakout_down, "Upper Line Breakout Down", "Upper Line Bearish Breakout")// Optional: Display current upper line valuevar label upper_label = naif not na(upper_line) if na(upper_label) upper_label := label.new(bar_index, upper_line, "U: " + str.tostring(math.round(upper_line, 2)), style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small) else label.set_xy(upper_label, bar_index, upper_line) label.set_text(upper_label, "U: " + str.tostring(math.round(upper_line, 2)))// --------------------------------------------------------------------------------------------------------------------}위 스크립트는 첫번째 요청 스크립트와 약간 다른 스크립트입니다. 위 2번째 스크립트 또한 예스트레이더 검색기로 변환시켜주시면 감사드리겠습니다 (__)
답변완료
번호 추가 좀 요청 드림니다.
ㅇ 매번 도움에 고맙습니다. ㅇ 아래 수식에서 그림 처럼 선이 생기면 번호 부여좀 부탁 드림니다. ㅇ 글자크기 : 30 이상 상승 빨강색 하락 블루 ## 아래 수식 var : TX(0); input : P(20),n(5),틱(20), 굵기(5); var : cnt(0),LL(0),HH(0); Array : LTL[10](0),HTL[10](0),LI[10](0),HI[10](0),Lv[10](0),Hv[10](0);; var : LTL1(0),LTL2(0),LTL3(0),LTL4(0),LTL5(0),LTL6(0); var : HTL1(0),HTL2(0),HTL3(0),HTL4(0),HTL5(0),HTL6(0); if L < Lowest(L,P)[1] and (LL == 0 or (LL > 0 and abs(L-LL) >= PriceScale*틱)) Then { LL = L; For cnt = 9 DownTo 1 { LTL[cnt] = LTL[cnt-1]; Li[cnt] = Li[cnt-1]; Lv[cnt] = Lv[cnt-1]; } LTL[0] = TL_new(sDate,sTime,LL-PriceScale*0,NextBarSdate,NextBarStime,LL-PriceScale*0); Lv[0] = LL; Li[0] = Index; TL_SetColor(LTL[0],RgB(0,0,0)); TL_SetSize(LTL[0],굵기); TL_Delete(LTL[n]); } Else { TL_SetEnd(LTL[0],NextBarSdate,NextBarStime,LL[0]-PriceScale*0); } if H > highest(H,P)[1] and (HH == 0 or (HH > 0 and abs(H-HH) >= PriceScale*틱)) Then { HH = H; For cnt = 9 DownTo 1 { HTL[cnt] = HTL[cnt-1]; Hi[cnt] = Hi[cnt-1]; Hv[cnt] = Hv[cnt-1]; } HTL[0] = TL_new(sDate,sTime,HH+PriceScale*0,NextBarSdate,NextBarStime,HH+PriceScale*0); Hv[0] = HH+PriceScale*0; Hi[0] = Index; TL_SetColor(HTL[0],RgB(255,0,0)); TL_SetSize(HTL[0],굵기); TL_Delete(HTL[n]); } Else { TL_SetEnd(HTL[0],NextBarSdate,NextBarStime,HH+PriceScale*0); } For cnt = 1 to n-1 { if LL[cnt] > 0 and Index <= Li[cnt]+5 Then TL_SetEnd(LTL[cnt],NextBarSdate,NextBarStime,Lv[cnt]); if HH[cnt] > 0 and Index <= Hi[cnt]+5 Then TL_SetEnd(HTL[cnt],NextBarSdate,NextBarStime,Hv[cnt]); } ㅇ 고맙습니다.
답변완료
K-means 클러스터링(K-means clustering)
5일(기본입력값) 고가 돌파매수 저가 이탈매도 지표식을 AI(클러스터링) 방식으로 동적으로 선택하도록 설계한 예스트레이더용 구현 템플릿을 AI 질문했더니아래처럼 제공했습니다만 예스랭귀지에 사용 부적합인지라iM증권 예스트레이더에 부합하는 코드로 변환을 부탁드립니다.// === 입력값 ===input minN = 3input maxN = 10input stepN = 1input perfMemory = 10 // 지수평활(미사용 시 단순평가)input fromCluster = "Best" // "Best" / "Average" / "Worst"input maxIter = 100input maxBars = 1000 // 과거 평가용 봉 수input defaultN = 5 // 안전 기본값// === 후보 N 목록 생성 ===var array<int> candN = array.new()for n = minN to maxN step stepN array.push(candN, n)endfor// === 각 후보의 퍼포먼스 계산 (단순 누적 수익) ===var array<float> perfList = array.new()var array<int> factorList = array.new()// 현재 BAR_COUNT(플랫폼에 따라 이름 다를 수 있음)barsToEvaluate = min(barcount(), maxBars)// for each candidate N, 시뮬레이션for idx = 0 to array.size(candN)-1 N = array.get(candN, idx) cash = 0.0 position = 0 // 0=flat, 1=long entry_price = 0.0 // 시간 흐름: 오래된 -> 최신 (플랫폼 루프 방법에 따라 조정) // 여기서는 i는 과거 offset (barsToEvaluate downto 1) for offset = barsToEvaluate down to 1 // 전봉 기준 N기간 최고/최저 (함수명: HHV / LLV 또는 highest/lowest 로 바꿔서 사용) hh = HHV(high, N, offset) // = offset번째 시점에서의 N기간 최고 (함수명 확인 필요) ll = LLV(low, N, offset) // 현재 바의 종가 (offset 시점) c = ref(close, offset) // 진입: 종가가 전봉 기준 N기간 최고 돌파 (전략 규칙) if position == 0 and c > hh position = 1 entry_price = c endif // 청산: 포지션 중 저가 이탈 if position == 1 and c < ll profit = c - entry_price cash = cash + profit position = 0 entry_price = 0.0 endif endfor // 시뮬레이션 종료 시 미청산 포지션 정리(평가 목적) if position == 1 last_close = close // 최신 종가 cash = cash + (last_close - entry_price) endif array.push(perfList, cash) array.push(factorList, N)endfor// === 퍼포먼스 값에서 초기 centroid 계산 (25/50/75 percentile) ===// 플랫폼에 percentile 함수가 없다면 간단 정렬 후 인덱스로 대체 가능perf_sorted = array.copy(perfList)array.sort(perf_sorted) // 오름차순sizeP = array.size(perf_sorted)p25_idx = max(0, floor(0.25 * (sizeP - 1)))p50_idx = max(0, floor(0.50 * (sizeP - 1)))p75_idx = max(0, floor(0.75 * (sizeP - 1)))centroids = array.new()array.push(centroids, array.get(perf_sorted, p25_idx))array.push(centroids, array.get(perf_sorted, p50_idx))array.push(centroids, array.get(perf_sorted, p75_idx))// === K-means 1D 반복 ===for iter = 1 to maxIter // 초기화 clusters_perf = array.from(array.new(), array.new(), array.new()) clusters_factor = array.from(array.new(), array.new(), array.new()) // 할당 단계 for i = 0 to array.size(perfList)-1 val = array.get(perfList, i) // 거리 계산 d0 = abs(val - array.get(centroids, 0)) d1 = abs(val - array.get(centroids, 1)) d2 = abs(val - array.get(centroids, 2)) // 가장 작은 거리 인덱스 선택 idx_min = 0 if d1 < d0 idx_min = 1 if d2 < d1 idx_min = 2 endif else if d2 < d0 idx_min = 2 endif endif // 클러스터에 추가 array.push(array.get(clusters_perf, idx_min), val) array.push(array.get(clusters_factor, idx_min), array.get(factorList, i)) endfor // 중심 재계산 new_centroids = array.new() for k = 0 to 2 cperf = array.get(clusters_perf, k) if array.size(cperf) > 0 sumv = 0.0 for j = 0 to array.size(cperf)-1 sumv = sumv + array.get(cperf, j) endfor avgv = sumv / array.size(cperf) array.push(new_centroids, avgv) else // 빈 클러스터는 기존 centroid 유지 array.push(new_centroids, array.get(centroids, k)) endif endfor // 수렴 체크 (모두 같다면 종료) if array.get(new_centroids,0) == array.get(centroids,0) and array.get(new_centroids,1) == array.get(centroids,1) and array.get(new_centroids,2) == array.get(centroids,2) break endif centroids := new_centroidsendfor// === 선택 클러스터 매핑 ('Worst'=0, 'Average'=1, 'Best'=2) ===selIdx = 2if fromCluster == "Worst" then selIdx = 0 endifif fromCluster == "Average" then selIdx = 1 endif// 선택 클러스터의 평균 N 계산 (없으면 기본값)chosenN = defaultNsel_factors = array.get(clusters_factor, selIdx)if array.size(sel_factors) > 0 ssum = 0 for i = 0 to array.size(sel_factors)-1 ssum = ssum + array.get(sel_factors, i) endfor chosenN = round(ssum / array.size(sel_factors))endif// === 실시간 시그널: chosenN 사용 ===// 최신 N기간 최고/최저 계산 (함수명 HHV/LLV 사용)curr_hh = HHV(high, chosenN)curr_ll = LLV(low, chosenN)buySignal = close > curr_hhsellSignal = close < curr_ll// 출력(화면 및 알림용)plot_int("ChosenN", chosenN)plot_bool("Buy", buySignal)plot_bool("Sell", sellSignal)// 실제 주문/포지션 관리는 전략 엔진 규칙에 맞춰 작성
답변완료
부탁드립니다
수고하십니다 아래수식을 오류 없게 수정부탁드립니다inputs: ShortLength(50), LongLength(150), RetestSignals(false), CandleColor(true), UpperColor(Magenta), LowerColor(Blue);variables: ATRValue(0), ShortKalman(0), LongKalman(0), // Kalman filter variables for short ShortEstimate(0), ShortErrorEst(1.0), ShortKalmanGain(0), ShortPrediction(0), ShortErrorMeas(0), ShortInitialized(false), // Kalman filter variables for long LongEstimate(0), LongErrorEst(1.0), LongKalmanGain(0), LongPrediction(0), LongErrorMeas(0), LongInitialized(false), TrendUp(false), PrevTrendUp(false), TrendColor(0), TrendColor1(0), CandleCol(0), UpperBoxTop(0), UpperBoxBottom(0), UpperBoxStart(0), LowerBoxTop(0), LowerBoxBottom(0), LowerBoxStart(0), BoxActive(false), R(0.01), Q(0.1);// Calculate ATRATRValue = AvgTrueRange(200) * 0.5;// Kalman Filter for Short LengthShortErrorMeas = R * ShortLength;if not ShortInitialized then begin ShortEstimate = Close; ShortInitialized = true;end;ShortPrediction = ShortEstimate;ShortKalmanGain = ShortErrorEst / (ShortErrorEst + ShortErrorMeas);ShortEstimate = ShortPrediction + ShortKalmanGain * (Close - ShortPrediction);ShortErrorEst = (1 - ShortKalmanGain) * ShortErrorEst + Q / ShortLength;ShortKalman = ShortEstimate;// Kalman Filter for Long LengthLongErrorMeas = R * LongLength;if not LongInitialized then begin LongEstimate = Close; LongInitialized = true;end;LongPrediction = LongEstimate;LongKalmanGain = LongErrorEst / (LongErrorEst + LongErrorMeas);LongEstimate = LongPrediction + LongKalmanGain * (Close - LongPrediction);LongErrorEst = (1 - LongKalmanGain) * LongErrorEst + Q / LongLength;LongKalman = LongEstimate;// Determine trendPrevTrendUp = TrendUp;TrendUp = ShortKalman > LongKalman;// Set colorsif TrendUp then TrendColor = UpperColorelse TrendColor = LowerColor;if ShortKalman > ShortKalman[2] then TrendColor1 = UpperColorelse TrendColor1 = LowerColor;// Candle coloringif CandleColor then begin if TrendUp and ShortKalman > ShortKalman[2] then CandleCol = UpperColor else if not TrendUp and ShortKalman < ShortKalman[2] then CandleCol = LowerColor else CandleCol = DarkGray;end;// Plot Kalman filtersPlot1(ShortKalman, "Short Kalman", TrendColor1);Plot2(LongKalman, "Long Kalman", TrendColor);// Trend change detection and signalsif TrendUp and not PrevTrendUp then begin // Uptrend signal Text_New(Date, Time, Low, "UP"); // Create lower box LowerBoxStart = CurrentBar; LowerBoxTop = Low + ATRValue; LowerBoxBottom = Low; BoxActive = true;end;if not TrendUp and PrevTrendUp then begin // Downtrend signal Text_New(Date, Time, High, "DN"); // Create upper box UpperBoxStart = CurrentBar; UpperBoxTop = High; UpperBoxBottom = High - ATRValue; BoxActive = true;end;// Retest signalsif RetestSignals then begin if not TrendUp and BoxActive then begin if High < UpperBoxBottom and High[1] >= UpperBoxBottom then Text_New(Date, Time, High[1], "x"); end; if TrendUp and BoxActive then begin if Low > LowerBoxTop and Low[1] <= LowerBoxTop then Text_New(Date, Time, Low[1], "+"); end;end;// Apply candle coloringif CandleColor then PlotPB(Open, High, Low, Close, CandleCol, CandleCol);