커뮤니티

수식변환 부탁드립니다.

프로필 이미지
cooparoo
2024-05-07 07:24:04
1065
글번호 179170
답변완료
안녕하세요! 다음 파인스크립트 수식을 예스로 변환 부탁드립니다. 감사합니다. //@version=5 indicator("Linear Regression Channel", shorttitle="LinReg", overlay=true) lengthInput = input.int(100, title="Length", minval = 1, maxval = 600) sourceInput = input.source(close, title="Source") group1 = "Channel Settings" useUpperDevInput = input.bool(true, title="Upper Deviation", inline = "Upper Deviation", group = group1) upperMultInput = input.float(2.0, title="", inline = "Upper Deviation", group = group1) useLowerDevInput = input.bool(true, title="Lower Deviation", inline = "Lower Deviation", group = group1) lowerMultInput = input.float(2.0, title="", inline = "Lower Deviation", group = group1) group2 = "Display Settings" showPearsonInput = input.bool(true, "Show Pearson's R", group = group2) extendLeftInput = input.bool(false, "Extend Lines Left", group = group2) extendRightInput = input.bool(true, "Extend Lines Right", group = group2) extendStyle = switch extendLeftInput and extendRightInput => extend.both extendLeftInput => extend.left extendRightInput => extend.right => extend.none group3 = "Color Settings" colorUpper = input.color(color.new(color.blue, 85), "", inline = group3, group = group3) colorLower = input.color(color.new(color.red, 85), "", inline = group3, group = group3) calcSlope(source, length) => max_bars_back(source, 600) if not barstate.islast or length <= 1 [float(na), float(na), float(na)] else sumX = 0.0 sumY = 0.0 sumXSqr = 0.0 sumXY = 0.0 for i = 0 to length - 1 by 1 val = source[i] per = i + 1.0 sumX += per sumY += val sumXSqr += per * per sumXY += val * per slope = (length * sumXY - sumX * sumY) / (length * sumXSqr - sumX * sumX) average = sumY / length intercept = average - slope * sumX / length + slope [slope, average, intercept] [s, a, i] = calcSlope(sourceInput, lengthInput) startPrice = i + s * (lengthInput - 1) endPrice = i var line baseLine = na if na(baseLine) and not na(startPrice) baseLine := line.new(bar_index - lengthInput + 1, startPrice, bar_index, endPrice, width=1, extend=extendStyle, color=color.new(colorLower, 0)) else line.set_xy1(baseLine, bar_index - lengthInput + 1, startPrice) line.set_xy2(baseLine, bar_index, endPrice) na calcDev(source, length, slope, average, intercept) => upDev = 0.0 dnDev = 0.0 stdDevAcc = 0.0 dsxx = 0.0 dsyy = 0.0 dsxy = 0.0 periods = length - 1 daY = intercept + slope * periods / 2 val = intercept for j = 0 to periods by 1 price = high[j] - val if price > upDev upDev := price price := val - low[j] if price > dnDev dnDev := price price := source[j] dxt = price - average dyt = val - daY price -= val stdDevAcc += price * price dsxx += dxt * dxt dsyy += dyt * dyt dsxy += dxt * dyt val += slope stdDev = math.sqrt(stdDevAcc / (periods == 0 ? 1 : periods)) pearsonR = dsxx == 0 or dsyy == 0 ? 0 : dsxy / math.sqrt(dsxx * dsyy) [stdDev, pearsonR, upDev, dnDev] [stdDev, pearsonR, upDev, dnDev] = calcDev(sourceInput, lengthInput, s, a, i) upperStartPrice = startPrice + (useUpperDevInput ? upperMultInput * stdDev : upDev) upperEndPrice = endPrice + (useUpperDevInput ? upperMultInput * stdDev : upDev) var line upper = na lowerStartPrice = startPrice + (useLowerDevInput ? -lowerMultInput * stdDev : -dnDev) lowerEndPrice = endPrice + (useLowerDevInput ? -lowerMultInput * stdDev : -dnDev) var line lower = na if na(upper) and not na(upperStartPrice) upper := line.new(bar_index - lengthInput + 1, upperStartPrice, bar_index, upperEndPrice, width=1, extend=extendStyle, color=color.new(colorUpper, 0)) else line.set_xy1(upper, bar_index - lengthInput + 1, upperStartPrice) line.set_xy2(upper, bar_index, upperEndPrice) na if na(lower) and not na(lowerStartPrice) lower := line.new(bar_index - lengthInput + 1, lowerStartPrice, bar_index, lowerEndPrice, width=1, extend=extendStyle, color=color.new(colorUpper, 0)) else line.set_xy1(lower, bar_index - lengthInput + 1, lowerStartPrice) line.set_xy2(lower, bar_index, lowerEndPrice) na linefill.new(upper, baseLine, color = colorUpper) linefill.new(baseLine, lower, color = colorLower) float trend = math.sign(startPrice - endPrice) alertcondition(sourceInput > line.get_price(upper, bar_index) or sourceInput < line.get_price(lower, bar_index), title='Regression Channel Exited', message="The price movement has exited Regression Channel's bounds") alertcondition(trend[1] >= 0 and trend < 0, title='Switched to Uptrend', message='The Regression Channel trend switched from Downtrend to Uptrend') alertcondition(trend[1] <= 0 and trend > 0, title='Switched to Downtrend', message='The Regression Channel trend switched from Uptrend to Downtrend') // Pearson's R var label r = na label.delete(r[1]) if showPearsonInput and not na(pearsonR) r := label.new(bar_index - lengthInput + 1, lowerStartPrice, str.tostring(pearsonR, "#.################"), color = color.new(color.white, 100), textcolor=color.new(colorUpper, 0), size=size.normal, style=label.style_label_up)
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2024-05-07 15:51:40

안녕하세요 예스스탁입니다. 추세선으로 그려야 하는데 추세선 사이에 색을 채우는 기능이 없어 선만 출력하게 작성해 드립니다. input : length(100); input : useUpperDevInput(true); input : upperMultInput(2.0); input : useLowerDevInput(true); input : lowerMultInput(2.0); input : extendLeftInput(false); input : extendRightInput(true); var : cnt(0),source(0),sumX(0),sumY(0),sumXSqr(0),sumXY(0); var : vals(0),per(0),s(0),a(0),i(0),startPrice(0),endPrice(0); var : upperTL(0),midTL(0),lowerTL(0); source = c; sumX = 0.0; sumY = 0.0; sumXSqr = 0.0; sumXY = 0.0; for cnt = 0 to length - 1 { vals = source[cnt]; per = cnt + 1.0; sumX = sumX+per; sumY = sumY+vals; sumXSqr = sumXSqr+(per * per); sumXY = sumXY + (vals * per); } s = (length * sumXY - sumX * sumY) / (length * sumXSqr - sumX * sumX); a = sumY / length; i = a - s * sumX / length + s; startPrice = i + s * (length - 1); endPrice = i; var : upDev(0),dnDev(0),stdDevAcc(0),dsxx(0),dsyy(0),dsxy(0); var : periods(0),daY(0),val(0),j(0),price(0),dxt(0),dyt(0); var : stdDev(0),pearsonR(0); upDev = 0.0; dnDev = 0.0; stdDevAcc = 0.0; dsxx = 0.0; dsyy = 0.0; dsxy = 0.0; periods = length - 1; daY = i + s * periods / 2; val = i; for j = 0 to periods { price = high[j] - val; if price > upDev then upDev = price; price = val - low[j]; if price > dnDev Then dnDev = price; price = source[j]; dxt = price - a; dyt = val - daY; price = price-val; stdDevAcc = stdDevAcc+(price * price); dsxx = dsxx + (dxt * dxt); dsyy = dsyy + (dyt * dyt); dsxy = dsxy + (dxt * dyt); val = val+ s; } stdDev = sqrt(stdDevAcc / IFf(periods == 0 , 1 , periods)); pearsonR = iff(dsxx == 0 or dsyy == 0 , 0 , dsxy /sqrt(dsxx * dsyy)); var : upperStartPrice(0),upperEndPrice(0),lowerStartPrice(0),lowerEndPrice(0); upperStartPrice = startPrice + IFF(useUpperDevInput , upperMultInput * stdDev , upDev); upperEndPrice = endPrice + IFf(useUpperDevInput , upperMultInput * stdDev , upDev); lowerStartPrice = startPrice + IFf(useLowerDevInput , -lowerMultInput * stdDev , -dnDev); lowerEndPrice = endPrice + IFf(useLowerDevInput , -lowerMultInput * stdDev , -dnDev); TL_Delete(upperTL); TL_Delete(midTL); TL_Delete(lowerTL); upperTL = TL_New(sDate[length-1],sTime[length-1],upperStartPrice,sDate,sTime,upperEndPrice); midTL = TL_New(sDate[length-1],sTime[length-1],startPrice,sDate,sTime,endprice); lowerTL = TL_New(sDate[length-1],sTime[length-1],lowerStartPrice,sDate,sTime,lowerEndPrice); TL_SetColor(upperTL,Blue); TL_SetColor(midTL,Red); TL_SetColor(lowerTL,Blue); TL_SetStyle(midTL,3); if extendLeftInput == true Then { TL_SetExtLeft(upperTL,true); TL_SetExtLeft(midTL,true); TL_SetExtLeft(lowerTL,true); } if extendRightInput == true Then { TL_SetExtRight(upperTL,true); TL_SetExtRight(midTL,true); TL_SetExtRight(lowerTL,true); } 즐거운 하루되세요 > cooparoo 님이 쓴 글입니다. > 제목 : 수식변환 부탁드립니다. > 안녕하세요! 다음 파인스크립트 수식을 예스로 변환 부탁드립니다. 감사합니다. //@version=5 indicator("Linear Regression Channel", shorttitle="LinReg", overlay=true) lengthInput = input.int(100, title="Length", minval = 1, maxval = 600) sourceInput = input.source(close, title="Source") group1 = "Channel Settings" useUpperDevInput = input.bool(true, title="Upper Deviation", inline = "Upper Deviation", group = group1) upperMultInput = input.float(2.0, title="", inline = "Upper Deviation", group = group1) useLowerDevInput = input.bool(true, title="Lower Deviation", inline = "Lower Deviation", group = group1) lowerMultInput = input.float(2.0, title="", inline = "Lower Deviation", group = group1) group2 = "Display Settings" showPearsonInput = input.bool(true, "Show Pearson's R", group = group2) extendLeftInput = input.bool(false, "Extend Lines Left", group = group2) extendRightInput = input.bool(true, "Extend Lines Right", group = group2) extendStyle = switch extendLeftInput and extendRightInput => extend.both extendLeftInput => extend.left extendRightInput => extend.right => extend.none group3 = "Color Settings" colorUpper = input.color(color.new(color.blue, 85), "", inline = group3, group = group3) colorLower = input.color(color.new(color.red, 85), "", inline = group3, group = group3) calcSlope(source, length) => max_bars_back(source, 600) if not barstate.islast or length <= 1 [float(na), float(na), float(na)] else sumX = 0.0 sumY = 0.0 sumXSqr = 0.0 sumXY = 0.0 for i = 0 to length - 1 by 1 val = source[i] per = i + 1.0 sumX += per sumY += val sumXSqr += per * per sumXY += val * per slope = (length * sumXY - sumX * sumY) / (length * sumXSqr - sumX * sumX) average = sumY / length intercept = average - slope * sumX / length + slope [slope, average, intercept] [s, a, i] = calcSlope(sourceInput, lengthInput) startPrice = i + s * (lengthInput - 1) endPrice = i var line baseLine = na if na(baseLine) and not na(startPrice) baseLine := line.new(bar_index - lengthInput + 1, startPrice, bar_index, endPrice, width=1, extend=extendStyle, color=color.new(colorLower, 0)) else line.set_xy1(baseLine, bar_index - lengthInput + 1, startPrice) line.set_xy2(baseLine, bar_index, endPrice) na calcDev(source, length, slope, average, intercept) => upDev = 0.0 dnDev = 0.0 stdDevAcc = 0.0 dsxx = 0.0 dsyy = 0.0 dsxy = 0.0 periods = length - 1 daY = intercept + slope * periods / 2 val = intercept for j = 0 to periods by 1 price = high[j] - val if price > upDev upDev := price price := val - low[j] if price > dnDev dnDev := price price := source[j] dxt = price - average dyt = val - daY price -= val stdDevAcc += price * price dsxx += dxt * dxt dsyy += dyt * dyt dsxy += dxt * dyt val += slope stdDev = math.sqrt(stdDevAcc / (periods == 0 ? 1 : periods)) pearsonR = dsxx == 0 or dsyy == 0 ? 0 : dsxy / math.sqrt(dsxx * dsyy) [stdDev, pearsonR, upDev, dnDev] [stdDev, pearsonR, upDev, dnDev] = calcDev(sourceInput, lengthInput, s, a, i) upperStartPrice = startPrice + (useUpperDevInput ? upperMultInput * stdDev : upDev) upperEndPrice = endPrice + (useUpperDevInput ? upperMultInput * stdDev : upDev) var line upper = na lowerStartPrice = startPrice + (useLowerDevInput ? -lowerMultInput * stdDev : -dnDev) lowerEndPrice = endPrice + (useLowerDevInput ? -lowerMultInput * stdDev : -dnDev) var line lower = na if na(upper) and not na(upperStartPrice) upper := line.new(bar_index - lengthInput + 1, upperStartPrice, bar_index, upperEndPrice, width=1, extend=extendStyle, color=color.new(colorUpper, 0)) else line.set_xy1(upper, bar_index - lengthInput + 1, upperStartPrice) line.set_xy2(upper, bar_index, upperEndPrice) na if na(lower) and not na(lowerStartPrice) lower := line.new(bar_index - lengthInput + 1, lowerStartPrice, bar_index, lowerEndPrice, width=1, extend=extendStyle, color=color.new(colorUpper, 0)) else line.set_xy1(lower, bar_index - lengthInput + 1, lowerStartPrice) line.set_xy2(lower, bar_index, lowerEndPrice) na linefill.new(upper, baseLine, color = colorUpper) linefill.new(baseLine, lower, color = colorLower) float trend = math.sign(startPrice - endPrice) alertcondition(sourceInput > line.get_price(upper, bar_index) or sourceInput < line.get_price(lower, bar_index), title='Regression Channel Exited', message="The price movement has exited Regression Channel's bounds") alertcondition(trend[1] >= 0 and trend < 0, title='Switched to Uptrend', message='The Regression Channel trend switched from Downtrend to Uptrend') alertcondition(trend[1] <= 0 and trend > 0, title='Switched to Downtrend', message='The Regression Channel trend switched from Uptrend to Downtrend') // Pearson's R var label r = na label.delete(r[1]) if showPearsonInput and not na(pearsonR) r := label.new(bar_index - lengthInput + 1, lowerStartPrice, str.tostring(pearsonR, "#.################"), color = color.new(color.white, 100), textcolor=color.new(colorUpper, 0), size=size.normal, style=label.style_label_up)