|
Kodexempel: RSI m fl |
Scroll Föregående Topp Nästa Fler |
#global nbrparams(3)
#global dataserie("upMove");
#global dataserie("downMove");
#global dataserie("avgUp");
#global dataserie("avgDown");
#global dataserie("rsiCalc");
local n = p1;
local delta = 0;
// 1) Prisförändring (delta)
if (BarNumber == 0)
{
delta = 0;
}
else
{
delta = Close[0] - Close[-1];
}
// 2) Dela upp i upp/ned-rörelse
if (delta > 0)
{
upMove[0] = delta;
downMove[0] = 0;
}
else
{
upMove[0] = 0;
downMove[0] = fabs(delta); // fabs rekommenderas för decimaltal
}
// 3) Wilder smoothing av avgUp/avgDown
// Init: första gången vi har minst n+1 bars (BarNumber == n) sätter vi startvärde som SMA
if (BarNumber == n)
{
avgUp[0] = upMove.sum(n) / n;
avgDown[0] = downMove.sum(n) / n;
}
else if (BarNumber > n)
{
avgUp[0] = avgUp[-1] + (1.0 / n) * (upMove[0] - avgUp[-1]);
avgDown[0] = avgDown[-1] + (1.0 / n) * (downMove[0] - avgDown[-1]);
}
else
{
// För tidiga bars: sätt 0 (eller lämna tomt beroende på hur du vill att grafen ska se ut)
avgUp[0] = 0;
avgDown[0] = 0;
}
// 4) RSI = 100 - (100 / (1 + RS)), där RS = avgUp/avgDown
if (BarNumber <= n)
{
rsiCalc[0] = 0; // ännu ej "riktig" RSI
}
else if (avgDown[0] == 0)
{
rsiCalc[0] = 100;
}
else
{
local rs = avgUp[0] / avgDown[0];
rsiCalc[0] = 100 - (100 / (1 + rs));
}
// 5) Rita ut
plot1[0] = rsiCalc[0];
plot2[0] = p3; // övre nivå, t ex 70
plot3[0] = p2; // undre nivå, t ex 30