-
Notifications
You must be signed in to change notification settings - Fork 2
/
Adaptive Linear Regression
99 lines (89 loc) · 4.21 KB
/
Adaptive Linear Regression
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Author & Developer : © dg_factor [13.08.2023]
// UYARI
// Geliştirme amaçlıdır, doğrudan alım-satım stratejisi yerine ikame edilemez.
// LINK (video)
// https://twitter.com/dg_factor/status/1690796984964091905
// AÇIKLAMA
// Aşağıdaki komut herhangi bir data serisi üzerinde Lineer Regresyon Kanalı'nın çizimine örnek teşkil eder.
// Lineer Regresyon, aralarında neden-sonuç ilişkisi bulunan bağımlı ve bağımsız değişkenlerden;
// bağımsız olanlara dayalı olarak bağımlı değişkeni tahmin etmek için kullanılan bir analiz yöntemidir.
// Bir sebebe bağlı olarak ileriye yönelik tahmin amaçlar.
// Regresyon Kanalı direnç ve destek seviyelerinin belirlenmesi amacıyla; (örneklem) sapma değeri ve onun katlarına dayalı olarak hesaplanır.
// UYARI (REPAINT)
// Repaint kısaca, bir datanın geçmiş değerlerinin sonraki barlarda değişmesi olarak tanımlanabilir.
// Regresyon kanalı her barda dizinin kaydırılmasıyla hesaplanan dinamik bir göstergedir, dolayısıyla repaint yapar.
// "Statik Kanal" hareket etmez, indikatörü çalıştırıdığınız ana ait seviyeleri "dondurur".
//@version=5
indicator("Adaptive Linear Regression")
g1 = "KAYNAK GİRİNİZ"
data = input(title="Data", defval=close, group=g1)
t1 = "Dinamik kanal sürekli güncellenir ve repaint yapar."
t2 = "Statik kanal repaint yapmaz. İndikatörün çalıştırıldığı an itibariyle oluşmuş seviyeleri çizer ve asla değişmez. " +
"(Açık olan bar hesaplamaya dahil değildir)."
t3 = "Band çizimi dinamiktir ve repaint yapmaz, en güvenilir sonucu gösterir."
g2 = "KONFİGÜRASYON"
uzunluk = input.int(title="Uzunluk", defval=100, group=g2)
katsayi = input.float(title="Katsayı", defval=2.0, step=0.1, group=g2)
c1 = input.color(title="Renk ", defval=#00bcd4, group=g2, inline="c")
c2 = input.color(title="", defval=#00bb00, group=g2, inline="c")
c3 = input.color(title="", defval=#fb0000, group=g2, inline="c")
dinamik = input.bool(title="Dinamik Kanal", defval=true, group=g2, tooltip=t1)
statik = input.bool(title="Statik Kanal", defval=true, group=g2, tooltip=t2)
band = input.bool(title="Band", defval=false, group=g2, tooltip=t3)
uzat = input.bool(title="Uzat", defval=false, group=g2)
_uzat = uzat ? extend.right : extend.none
// Level Func
f_lvl(r, c) =>
var line ln = na, line.delete(ln)
var label lb = na, label.delete(lb)
ln := statik ? line.new(bar_index, r, bar_index+50, r, xloc.bar_index,
uzat ? extend.left : extend.none, c, line.style_dashed) : na
lb := statik ? label.new(bar_index+50, r, str.tostring(r, format.mintick), xloc.bar_index, yloc.price,
#00000000, label.style_label_left, c, size.normal, text.align_right) : na
//
// Hesaplamalar
x = bar_index
y = data
_x = math.sum(x, uzunluk)
_y = math.sum(y, uzunluk)
_xy = math.sum(x * y, uzunluk)
_xx = math.sum(x * x, uzunluk)
// y = mx + b için;
m = (uzunluk * _xy - _x * _y) / (uzunluk * _xx - _x * _x)
b = (_y - m * _x) / uzunluk
r = ta.correlation(x, y, uzunluk)
dt = math.pow(r, 2) * 100
// Apsis
x1 = x - uzunluk + 1
x2 = x
// Ordinat
y1 = m * x1 + b
y2 = m * x2 + b // ta.linreg(data, uzunluk, 0)
// Sapma (Örneklem)
varyans = 0.0
for i = 0 to uzunluk - 1
varyans += math.pow(y[i] - (m * (x - i) + b), 2)
varyans
sapma = math.sqrt(varyans / uzunluk) * katsayi
// Çizim
reg = dinamik ? line.new(x1, y1, x2, y2, xloc.bar_index, _uzat, c1) : na, line.delete(reg[1])
ust = dinamik ? line.new(x1, y1 + sapma, x2, y2 + sapma, xloc.bar_index, _uzat, c2) : na, line.delete(ust[1])
alt = dinamik ? line.new(x1, y1 - sapma, x2, y2 - sapma, xloc.bar_index, _uzat, c3) : na, line.delete(alt[1])
// Statik Seviyeler
var float md = na
var float up = na
var float dn = na
if barstate.islastconfirmedhistory
md := y2
up := y2 + sapma
dn := y2 - sapma
f_lvl(md, c1)
f_lvl(up, c2)
f_lvl(dn, c3)
plot(data, title="Data", color=color.silver)
plot(not band ? na : y2 + sapma, "up", c2)
plot(not band ? na : y2, "mid", c1)
plot(not band ? na : y2 - sapma, "down", c3)
plot(r, "Pearson r", precision=2, display=display.data_window)
plot(dt, "Determination %", precision=2, display=display.data_window)