Herkese Merhaba, Uzun zamandır blog yazısı paylaşmıyordum, trading view için geliştirdiğim strateji koduyla dönelim dedik.
Şimdi borsapin frama stratejisi, trend takibini daha “akıllı” hale getirmek için iki güçlü yaklaşım kullanıyor. FRAMA (Fractal Adaptive Moving Average) ve Supertrend. Amaç, piyasadaki gürültüyü filtreleyip yalnızca güçlü ve sürdürülebilir trendlere girmek.
Stratejinin temelinde üç katmanlı bir filtreleme var. İlk olarak haftalık zaman diliminde FRAMA’nın yukarı eğimli olması gerekiyor. Bu, büyük resimde piyasanın gerçekten yükseliş trendinde olduğunu doğrular ve yatay piyasaları büyük ölçüde eler. Ardından günlük grafikte fiyatın FRAMA’nın üzerinde olması ve aynı zamanda FRAMA’nın yukarı yönlü olması gerekiyor. Son olarak ise Supertrend göstergesinin alış sinyali üretmesiyle bu üç koşul birlikte sağlandığında sistem “onaylı” bir long pozisyon açıyor.
Çıkış tarafında ise aceleci davranılmıyor. Günlük FRAMA’nın altına iniş tek başına yeterli değil; belirli sayıda bar boyunca bu zayıflığın devam etmesi gerekiyor. Buna ek olarak Supertrend’in satış sinyali vermesiyle birlikte pozisyon kapatılıyor.
Buradaki yaklaşım, ani dalgalanmalarda gereksiz çıkışları azaltmak, kısa vadeli gürültüyü filtreleyip orta-uzun vadeli trendleri yakalamaya odaklanıyoruz, disiplinli bir trend takip sistemi size sunar.. Özellikle “trend varsa kal, yoksa uzak dur” yada “düşen bıçağı tutma” mantıklarından esinlenildi.
// @frama & Supertrend - BorsaPin Kursatsenturk.com
// Giriş: Haftalık Yukarı Eğimli olacak + Günlük FRAMA AL sinyali verecek + Supertrend AL
// Çıkış: Günlük FRAMA (Teyitli) + Supertrend SAT
//@version=5
strategy("@frama BorsaPin Stratejisi", overlay=true, initial_capital=10000,
default_qty_type=strategy.percent_of_equity, default_qty_value=100,
process_orders_on_close=true)
// ═══════════════════════════════════════════════════════════════
// GİRDİLER
// ═══════════════════════════════════════════════════════════════
grp_date = "Backtest Tarih Aralığı"
startDate = input.time(timestamp("2024-01-01 00:00 +0300"), "Başlangıç", group=grp_date)
endDate = input.time(timestamp("2026-12-31 23:59 +0300"), "Bitiş", group=grp_date)
isInDate_Range = time >= startDate and time <= endDate
grp_params = "Gösterge Ayarları"
frama_len = input.int(16, "FRAMA Uzunluk", group=grp_params)
fc = input.int(1, "Hızlı Periyot (FC)", group=grp_params)
sc = input.int(200, "Yavaş Periyot (SC)", group=grp_params)
st_len = input.int(10, "Supertrend Periyot", group=grp_params)
st_mult = input.float(3.4, "Supertrend Çarpan", step=0.1, group=grp_params)
grp_logic = "Giriş ve Çıkış Filtreleri"
slope_thresh = input.float(0.1, "Haftalık Min. Eğim % (Yatay Filtresi)", step=0.01, group=grp_logic)
confirm_bars = input.int(3, "Satış Öncesi Bekleme (Bar Sayısı)", minval=1, group=grp_logic)
// ═══════════════════════════════════════════════════════════════
// Frama Hesaplama Fonksiyonu
// ═══════════════════════════════════════════════════════════════
f_frama(_src, _len, _fc, _sc) =>
float _frama = na
_half = _len / 2
_n1 = (ta.highest(high, _half) - ta.lowest(low, _half)) / _half
_n2 = (ta.highest(high[_half], _half) - ta.lowest(low[_half], _half)) / _half
_n3 = (ta.highest(high, _len) - ta.lowest(low, _len)) / _len
_dimen = (_n1 > 0 and _n2 > 0 and _n3 > 0) ? (math.log(_n1 + _n2) - math.log(_n3)) / math.log(2) : 1.0
_w = math.exp(-4.6 * (_dimen - 1))
_sc_a = 2.0 / (_sc + 1), _fc_a = 2.0 / (_fc + 1)
_alpha = math.max(_sc_a, math.min(_fc_a, _w * (_fc_a - _sc_a) + _sc_a))
_frama := na(_frama[1]) ? _src : (_alpha * _src) + ((1.0 - _alpha) * nz(_frama[1], _src))
[_frama, _frama > nz(_frama[1], 0)]
// ═══════════════════════════════════════════════════════════════
// Hesaplamalar
// ═══════════════════════════════════════════════════════════════
// 1. Haftalık Frama (10 İşlem Günü / 2 Hafta Modu)
[wf_val, wf_up] = request.security(syminfo.tickerid, "W", f_frama(hlc3, frama_len, fc, sc), lookahead=barmerge.lookahead_on)
wf_slope_pct = ((wf_val - nz(wf_val[1])) / nz(wf_val[1])) * 100
wf_strict_up = wf_up and wf_slope_pct > slope_thresh // Yatay piyasa filtresi
// 2. Günlük Frama
[f_val, f_up] = f_frama(hlc3, frama_len, fc, sc)
// 3. Günlük Supertrend
[st_val, st_dir] = ta.supertrend(st_mult, st_len)
st_buy = st_dir == -1
// ═══════════════════════════════════════════════════════════════
// Mantık
// ═══════════════════════════════════════════════════════════════
// Giriş: Haftalık Eğim + Günlük Frama Üstü + Supertrend Yeşil
long_entry = wf_strict_up and close > f_val and st_buy
// ÇIKIŞ: Günlük Frama Altı (onaylı) + Supertrend Kırmızı
var int bars_below_frama = 0
bars_below_frama := (close < f_val or not f_up) ? bars_below_frama + 1 : 0
long_exit = (bars_below_frama >= confirm_bars) and (st_dir == 1)
// ═══════════════════════════════════════════════════════════════
// Görseller
// ═══════════════════════════════════════════════════════════════
// Haftalık (Mavi), Günlük (Yeşil/Kırmızı), Supertrend
plot(wf_val, "Haftalık Kilit", color=wf_strict_up ? color.blue : color.gray, linewidth=4)
plot(f_val, "Günlük Frama", color=f_up ? color.green : color.red, linewidth=2)
plot(st_val, "Supertrend", color=st_buy ? color.teal : color.orange, style=plot.style_linebr)
// Mum Boyama
bar_color = long_entry ? #00ff88 : (strategy.position_size > 0 and not long_exit ? #9ea4ad : #ff0044)
barcolor(bar_color)
// ═══════════════════════════════════════════════════════════════
// Emirler
// ═══════════════════════════════════════════════════════════════
if isInDate_Range
if long_entry
strategy.entry("Long", strategy.long, comment="Onaylı AL")
if long_exit and strategy.position_size > 0
strategy.close("Long", comment="Onaylı Çıkış")
Bu strateji güçlü bir trend takip sistemi olsa da, bazı önemli sakıncaları ve dikkat edilmesi gereken noktalar var.
Öncelikle FRAMA ve Supertrend gibi trend bazlı göstergeler, yatay (sideways) piyasalarda gecikmeli ve yanıltıcı sinyaller üretir. Özellikle trend oluşmadan önce yapılan girişler küçük geri çekilmelerde stop olma riskini artırır.
Haftalık filtre bu riski azaltmaya çalışsa da tamamen ortadan kaldırmayabilir. İkinci olarak, strateji gecikmeli (lagging) bir yapıya sahip. Yani fiyat hareketini önceden tahmin etmekten çok, oluşmuş trendi takip eder. Bu durum güçlü trendlerde avantaj sağlarken, hızlı dönüşlerde geç kalmaya neden olabilir.
Ayrıca Supertrend ve FRAMA birlikte kullanıldığı için bazı dönemlerde fazla filtreleme (over-filtering) oluşabilir ve bu da işlem sayısını ciddi şekilde azaltır. Bu, performansı artırabilir ama fırsat kaçırma riskini de beraberinde getirir. Son olarak, bu tür sistemler geçmiş veride iyi sonuç verse bile, piyasa rejimi değiştiğinde (volatilite, haber akışı, kriz dönemleri) performansları farklılaşır. Bu nedenle bu stratejiyi tek başına karar sistemi olarak değil, mutlaka risk yönetimi ve portföy çeşitlendirmesi ile birlikte kullanılmalı. Fundamental analizler, diğer tekniklerle desteklenmeside önemlidir.

Paylaştığım kodlarda sıkıntı yaşarsanız Google Drive Alanından indirmeniz daha iyi olur. Sitedeki kod gösterici eklentide ufak bir problem vardı. Bu sorunu başka bir plugingle çözdüm ve yazıların bir çoğunu güncelledim ama gözden kaçan düzenlenmemiş Python betiği yada Trading View Pine Script kodlarında sıkıntı olabilir.
Eğer sorun yaşarsanız yazının altına yorum yazarsanız tekrar gözden geçiririm.
Borsapin Python Bist Tarama ve Trading View Pine Script İndikatörleri için Google Drive alanı için buraya tıklayabilirsiniz.
Pivot noktaları, teknik analizde sıklıkla kullanılan ve bir varlığın olası destek ve direnç seviyelerini belirlemek için kullanılan matematiksel seviyelerdir. Bu seviyeler, yatırımcılara alım-satım kararlarında yardımcı olan önemli araçlardan biridir.
TradingView platformu üzerinde Pine Script ile geliştirilen ve grafik üzerinde çizim yapmadan sadece tablo formatında çalışan gelişmiş bir pivot analiz aracını tanıtacağız. Ayrıca kullanıcıların tercihlerine göre Klasik, Fibonacci veya Woodie pivot yöntemlerinden birini seçerek analiz yapabilmesi mümkün olacak. Youtubeda ki bir çok yayıncının yaptığı gibi bilgiyi para karşılığı satan bir zihniyette olmadığım için ücretsiz bir şekilde yararlanabilirsiniz.
Zaman Dilimi Seçimi: Günlük, Haftalık, Aylık ve Yıllık pivot seviyeleri hesaplanır.
Yöntem Seçimi: Kullanıcı, Klasik, Fibonacci veya Woodie hesaplama yöntemlerinden birini tercih edebilir.
Tablo Üzerinden Görselleştirme: Pivot, 3 destek ve 3 direnç seviyesi; ilgili zaman dilimi ve yönteme göre tablo halinde görüntülenir.
Kapanış Bekleme Opsiyonu: Haftalık, aylık ve yıllık mum kapanışları henüz gerçekleşmediyse, bir önceki dönemin verileri kullanılır. Ancak kullanıcı, ayarlardan Güncel veriyi kullanmak isterse bu seçeneği pasifleştirerek o anki mum verileriyle hesaplama yapabilir.
P = (High + Low + Close) / 3
R1 = (2 * P) – Low
S1 = (2 * P) – High
R2 = P + (High – Low)
S2 = P – (High – Low)
R3 = High + 2*(P – Low)
S3 = Low – 2*(High – P)
P = (High + Low + Close) / 3
R1 = P + 0.382 * (High – Low)
R2 = P + 0.618 * (High – Low)
R3 = P + 1.000 * (High – Low)
S1 = P – 0.382 * (High – Low)
S2 = P – 0.618 * (High – Low)
S3 = P – 1.000 * (High – Low)
P = (High + Low + 2 * Close) / 4
R1 = (2 * P) – Low
S1 = (2 * P) – High
R2 = P + (High – Low)
S2 = P – (High – Low)
R3 = High + 2*(P – Low)
S3 = Low – 2*(High – P)
TradingView’de yeni bir Pine Script oluşturun.
Kodunuzu yapıştırarak çalıştırın.
İndikatör, grafikte herhangi bir çizim yapmaz. Ancak ekranın sağ üst köşesinde pivot değerlerini detaylı bir şekilde gösteren bir tablo oluşturur.
Ayarlar kısmından:
Pivot türünü (Classic, Fibonacci, Woodie)
Zaman dilimini (Günlük, Haftalık , Aylık, Yıllık)
Text uzantılı dosya olarak indirmek isterseniz buraya tıklayın.
Trading View Günlük haftalık Aylık Yıllık PivotTablo Pine Script Kodu
// Bu, Pine Script™ kodu Mozilla Kamu Lisansı 2.0 (MPL-2.0) altında lisanslandı
// © krstsntrk © BorsaPin code is priority
//@version=5
indicator(title = 'BorsaPin Pivot Sistem', shorttitle = 'BorsaPin Pivot Sistem', overlay = true)
// === Kullanıcı Ayarları ===
pivotType = input.string("Woodie", title="Pivot Tipi", options=["Classic", "Fibonacci", "Woodie"])
useCurrentBar = input.bool(true, title="Kapanış Bekleme Opsiyonu (Açık mum yerine önceki kapanışı kullanır.)")
showDaily = input.bool(true, title="Günlük Pivot Göster")
showWeekly = input.bool(true, title="Haftalık Pivot Göster")
showMonthly = input.bool(true, title="Aylık Pivot Göster")
showYearly = input.bool(true, title="Yıllık Pivot Göster")
// === Zaman Aralığına Göre High/Low/Close ===
getHigh(_tf) => useCurrentBar ? request.security(syminfo.tickerid, _tf, high) : request.security(syminfo.tickerid, _tf, high[1])
getLow(_tf) => useCurrentBar ? request.security(syminfo.tickerid, _tf, low) : request.security(syminfo.tickerid, _tf, low[1])
getClose(_tf) => useCurrentBar ? request.security(syminfo.tickerid, _tf, close) : request.security(syminfo.tickerid, _tf, close[1])
// === Pivot Hesaplayıcı Fonksiyon ===
calcPivots(high_, low_, close_, _type) =>
pivot = 0.0
r1 = 0.0
r2 = 0.0
r3 = 0.0
s1 = 0.0
s2 = 0.0
s3 = 0.0
if _type == "Classic"
pivot := (high_ + low_ + close_) / 3
r1 := 2 * pivot - low_
s1 := 2 * pivot - high_
r2 := pivot + (high_ - low_)
s2 := pivot - (high_ - low_)
r3 := high_ + 2 * (pivot - low_)
s3 := low_ - 2 * (high_ - pivot)
else if _type == "Fibonacci"
pivot := (high_ + low_ + close_) / 3
r1 := pivot + 0.382 * (high_ - low_)
r2 := pivot + 0.618 * (high_ - low_)
r3 := pivot + 1.000 * (high_ - low_)
s1 := pivot - 0.382 * (high_ - low_)
s2 := pivot - 0.618 * (high_ - low_)
s3 := pivot - 1.000 * (high_ - low_)
else if _type == "Woodie"
pivot := (high_ + low_ + 2 * close_) / 4
r1 := (2 * pivot) - low_
s1 := (2 * pivot) - high_
r2 := pivot + (high_ - low_)
s2 := pivot - (high_ - low_)
r3 := high_ + 2 * (pivot - low_)
s3 := low_ - 2 * (high_ - pivot)
[pivot, r1, r2, r3, s1, s2, s3]
// === Her Zaman Dilimi İçin High / Low / Close Al ===
dH = getHigh("D")
dL = getLow("D")
dC = getClose("D")
wH = getHigh("W")
wL = getLow("W")
wC = getClose("W")
mH = getHigh("M")
mL = getLow("M")
mC = getClose("M")
yH = getHigh("12M")
yL = getLow("12M")
yC = getClose("12M")
// === Pivotları Hesapla ===
[dP, dR1, dR2, dR3, dS1, dS2, dS3] = calcPivots(dH, dL, dC, pivotType)
[wP, wR1, wR2, wR3, wS1, wS2, wS3] = calcPivots(wH, wL, wC, pivotType)
[mP, mR1, mR2, mR3, mS1, mS2, mS3] = calcPivots(mH, mL, mC, pivotType)
[yP, yR1, yR2, yR3, yS1, yS2, yS3] = calcPivots(yH, yL, yC, pivotType)
// === Tablo Oluştur ===
var table pivotTable = table.new(position.top_right, 8, 20, border_width=1)
// === Başlıklar ===
if bar_index % 10 == 0
table.cell(pivotTable, 0, 0, "Zaman", text_color=color.black, bgcolor=color.gray)
table.cell(pivotTable, 1, 0, "P", text_color=color.navy)
table.cell(pivotTable, 2, 0, "R1", text_color=color.lime)
table.cell(pivotTable, 3, 0, "R2", text_color=color.lime)
table.cell(pivotTable, 4, 0, "R3", text_color=color.lime)
table.cell(pivotTable, 5, 0, "S1", text_color=color.red)
table.cell(pivotTable, 6, 0, "S2", text_color=color.red)
table.cell(pivotTable, 7, 0, "S3", text_color=color.red)
// === Veri Satırı Ekleme Fonksiyonu ===
addRow(idx, label, p, r1, r2, r3, s1, s2, s3) =>
table.cell(pivotTable, 0, idx, label, text_color=color.black)
table.cell(pivotTable, 1, idx, str.tostring(p, format.mintick))
table.cell(pivotTable, 2, idx, str.tostring(r1, format.mintick))
table.cell(pivotTable, 3, idx, str.tostring(r2, format.mintick))
table.cell(pivotTable, 4, idx, str.tostring(r3, format.mintick))
table.cell(pivotTable, 5, idx, str.tostring(s1, format.mintick))
table.cell(pivotTable, 6, idx, str.tostring(s2, format.mintick))
table.cell(pivotTable, 7, idx, str.tostring(s3, format.mintick))
// === Tabloda Göster ===
row = 1
if showDaily
addRow(row, "Günlük", dP, dR1, dR2, dR3, dS1, dS2, dS3)
row += 1
if showWeekly
addRow(row, "Haftalık", wP, wR1, wR2, wR3, wS1, wS2, wS3)
row += 1
if showMonthly
addRow(row, "Aylık", mP, mR1, mR2, mR3, mS1, mS2, mS3)
row += 1
if showYearly
addRow(row, "Yıllık", yP, yR1, yR2, yR3, yS1, yS2, yS3)
GirişTeknik analiz, yatırımcıların geçmiş fiyat hareketlerinden yola çıkarak gelecekteki fiyatları tahmin etmelerine yardımcı olan güçlü bir araçtır. Bu analiz türünde sıkça kullanılan araçlardan biri de Üssel Hareketli Ortalama (EMA – Exponential Moving Average) göstergesidir.
EMA, son fiyat verilerine daha fazla ağırlık vererek trendi daha hassas şekilde yansıtır. Ancak tek başına bir EMA değeri yeterli olmayabilir. Bu nedenle, yatırımcılar farklı periyotlardaki EMA’ları kullanarak “EMA Up”, “EMA Nötr” ve “EMA Down” gibi trend yönlerini belirlemeye çalışır. Bu yazıda bu üç kavramı derinlemesine inceleyeceğiz.
EMA Nedir?
EMA, belirli bir dönem boyunca fiyatların ağırlıklı ortalamasını alır. Ağırlık, son verilere daha fazla verildiği için EMA, trend değişimlerine daha hızlı tepki verir.
EMA’nın Özellikleri:
EMA Periyotları
Genelde kullanılan EMA periyotları:
Kısa Vadeli EMA’lar: 5, 8, 13
Orta Vadeli EMA’lar: 21, 34
Uzun Vadeli EMA’lar: 55, 100, 200
Genişletmek gerekirse 5, 8 ,9, 13, 21, 34, 55, 89, 100, 144, 200, 233, 370, 610, 987 diye uzatılabilir
Kısa vade fiyat momentumunu gösterirken, uzun vadeli EMA’lar trendin yönünü anlamaya yardımcı olur.
1. EMA Up (Yükseliş Formasyonu)
Tanım: EMA Up durumu, kısa vadeli EMA’ların uzun vadeli EMA’ların üzerinde sıralandığı, tüm EMA’ların yukarı doğru eğimli olduğu bir trend yapısıdır.
Teknik Şartlar:
Kapanış Fiyatı > EMA(5) > EMA(8) > EMA(13) > EMA(21) > EMA(34) > EMA(55) > EMA(100) > EMA(200)
Hepsinin eğimi pozitiftir (yukarı yönlü).
Fiyat genellikle en kısa EMA’nın (örneğin EMA5) üstünde kalır.
Anlamı:
Güçlü ve sağlıklı bir yükseliş trendi vardır.
Alım sinyali olarak değerlendirilir. (daha&helliip;)
Finansal piyasalarda işlem yapan yatırımcılar için fiyat hareketlerini anlamak çoğu zaman zorlayıcıdır. İşte bu noktada hareketli ortalamalar (Moving Averages) devreye girer. Fiyat verilerini düzleştirerek trendleri daha anlaşılır hale getirir ve yatırımcılara yol gösterici olur.
Bu makalede, hareketli ortalamaların tanımını, çeşitlerini, avantajlarını ve teknik analizde nasıl kullanılmaları gerektiğini tüm detaylarıyla ele alacağız. (daha&helliip;)
Son Yorumlar