예스스탁
예스스탁 답변
2024-05-20 15:39:52
안녕하세요
예스스탁입니다.
// Parameters for EMAs
input : shortTermPeriod(50),longTermPeriod(200);
input : k(5);
input : lookbackPeriod(400);
var : shortTermEma(0),longTermEma(0),i(0),distance(0);
var : weightShortTermEma(0),totalWeight(0),weight(0);
var : minEma(0),maxEma(0),scaledWeightShortTermEma(0);
Array : distances[100](0),k_distances[100](0);
shortTermEma = ema(close, shortTermPeriod);
longTermEma = ema(close, longTermPeriod);
for i = 1 to 100 step 1
{
distance = abs(shortTermEma - longTermEma[i]);
distances[i-1] = distance;
}
SortArray(distances,100,1);
for i = 0 to k - 1 step 1
{
k_distances[i] = distances[i];
}
weightShortTermEma = 0;
totalWeight = 0;
for i = 0 to k - 1 step 1
{
weight = k_distances[i];
weightShortTermEma = weightShortTermEma+(shortTermEma[i] * weight);
totalWeight = totalWeight+ weight;
}
weightShortTermEma = weightShortTermEma/totalWeight;
minEma = lowest(weightShortTermEma, lookbackPeriod);
maxEma = highest(weightShortTermEma, lookbackPeriod);
scaledWeightShortTermEma = (weightShortTermEma - minEma) / (maxEma - minEma) * 100;
plot1(scaledWeightShortTermEma,"Scaled Weighted Short-Term EMA",Gray);
PlotBaseLine1(15);
PlotBaseLine2(50);
PlotBaseLine3(85);
즐거운 하루되세요
> 최원엽 님이 쓴 글입니다.
> 제목 : Hybrid EMA 지표 변환 문의(트레이딩뷰 자료)
> 아래와 같이 트레이딩뷰의 Hybrid EMA지표에 대한 소스를 복사를 했습니다.
변환하려고 해 봤는데 이해가 잘 되지 않아 변환 무의 드립니다.
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Uldisbebris
//@version=5
indicator("Hybrid EMA AlgoLearner", shorttitle="Hybrid EMA AlgoLearner", overlay=false)
// Parameters for EMAs
shortTermPeriod = 50
longTermPeriod = 200
// k-NN parameter
k = input.int(5, 'K - Number of neighbors')
// Calculate EMAs
shortTermEma = ta.ema(close, shortTermPeriod)
longTermEma = ta.ema(close, longTermPeriod)
// Custom k-NN Algorithm for weighted EMA
var float[] distances = array.new_float(0)
array.clear(distances)
for i = 1 to 100 by 1 // Loop through past 100 data points
distance = math.abs(shortTermEma - longTermEma[i])
array.push(distances, distance)
array.sort(distances)
k_distances = array.new_float(0)
for i = 0 to k - 1 by 1
array.push(k_distances, array.get(distances, i))
// Calculate weighted EMA based on closest k distances
weightShortTermEma = 0.0
totalWeight = 0.0
for i = 0 to k - 1 by 1
weight = array.get(k_distances, i)
weightShortTermEma += shortTermEma[i] * weight
totalWeight += weight
weightShortTermEma /= totalWeight
// Scale weightShortTermEma between 0 - 100
var float minEma = na
var float maxEma = na
// Instead of all the history, only look at the last N bars.
lookbackPeriod = input.int(400, 'lookbackPeriod')
minEma := ta.lowest(weightShortTermEma, lookbackPeriod)
maxEma := ta.highest(weightShortTermEma, lookbackPeriod)
scaledWeightShortTermEma = (weightShortTermEma - minEma) / (maxEma - minEma) * 100
//== plot
emaplot = plot(scaledWeightShortTermEma, title='Scaled Weighted Short-Term EMA', color = color.new(#a6a8a3, 0), linewidth = 1)
midLinePlot = plot(50, color = na, editable = false, display = display.none)
// Fill between plots and add horizontal lines
fill(emaplot, midLinePlot, 105, 85, top_color = color.new(#057ec4, 0), bottom_color = color.new(#6ca800, 100), title = "Overbought Gradient Fill")
fill(emaplot, midLinePlot, 15, -5, top_color = color.new(#a83c91, 100), bottom_color = color.new(#fcf801, 0), title = "Oversold Gradient Fill")
hline(15, color = color.new(#8b3131, 50))
hline(50, color = color.new(color.gray, 49))
hline(85, color = color.new(#2c5c2e, 50))