TradingView "Pine Screener" ile Hacim Sıçramalarını Anlık Tespit Etmek...
Coffee Break Letters #43 - 01.05.2025
Tradingview, grafik analizi denince akla ilk gelen platformlardan biri. Birçok insan bu uygulamanın sadece grafik araçlarını ve sağladığı veri setlerini kullanıyor ama uygulamanın çok değerli farklı özellikleri de var. Benim backtest ve stratejime uygun bazı filtrelerden anlık bildiriler almak için de kullandığım bu uygulama, kullanıcıların kendi stratejilerini test edebilecekleri ve gerçek zamanlı verilerle tarama yapabilecekleri çok önemli araçlarda sunuyor. Bu araçlardan biri de son dönemde kullanıma sundukları “Pine Screener” özelliği. Sanırım bu özellik şu an için sadece “Premium” üyeliklerde kullanılabiliyor.
Baştan söyleyeyim: Bu yazı bir TradingView reklamı değil. Yaklaşık 10 yıldır aktif olarak kullandığım, neredeyse her özelliğini kurcaladığım için bu platformu çok iyi tanıyorum. Dolayısıyla burada size anlattığım şey, bir tanıtım değil; gerçek bir kullanıcı deneyimi. Kendi işlem tarzıma ve ihtiyaçlarıma göre nasıl faydalandığımı paylaşıyorum. Siz de kendi sisteminize uyarlayabilirsiniz.
Pine Screener, klasik Pine Script yazımına ek olarak, gerçek zamanlı olarak belirli koşulları sağlayan enstrümanları tespit edebilmenizi sağlıyor. Yani artık manuel olarak yüzlerce grafik açmak zorunda değilsiniz; belirlediğiniz kurala göre çalışan bir Pine Screener kodu, size sadece o an dikkat çekici olanları gösterebilir. Bu gün içi ve gün sonu araştırmalarınız için müthiş bir avantaj.
Hacim Sıçramalarını Yakalamak Neden Önemli?
Piyasada bir hareketin başlaması çoğu zaman hacimle olur. Normalden yüksek hacim, bir enstrümanın “uyanmakta” olduğunu gösterebilir. Özellikle kripto piyasasında günün herhangi bir saatinde yaşanan ani hacim patlamaları, hisse senetlerinde seans başında ve sonuda gelen alışılmadık işlem hacimleri, çoğu zaman fiyat hareketinden önce gelir. Bu nedenle, hacimdeki bu olağandışı artışları erken fark edebilmek, tradera büyük avantaj sağlar.
Benim hazırladığım bu basit ama etkili screener, hem günlük hem saatlik grafiklerde çalıştırılabilir. Şu işi yapıyor:
Seçtiğiniz bir izleme listesi (watchlist) içerisinde bulunan enstrumanların, belirlediğiniz periyotta (örneğin 50 bar) ortalama hacmini hesaplıyor.
Hacim, bu ortalamanın belirlediğiniz katına (örneğin 2x) ulaşmışsa, enstruman filtreye takılıyor.
Böylece sadece “şu an bir şeyler oluyor olabilir” dediğimiz enstrümanlar listeleniyor.
Bu sistemi, gün içinde birkaç kez çalıştırmak, özellikle 24 saat açık olan kripto piyasasında erken uyarı sistemine sahip olmanızı sağlar. Aynı şekilde BIST tarafında da, gün içi hacim anormalliklerini kolayca fark etmenizi sağlar.
Ben bu screener’ı:
BIST ve Amerika’da seans başı, ortası ve sonunda ya da önemli zaman dilimlerinde çalıştırıyorum,
Coin’lerde gün içi fırsat buldukça saat başlarında yaklaşan hareketleri erkenden fark etmek için kullanıyorum,
Bu taramayı grafik üzerinde değil, tarama sekmesinde çalışan bir Pine Screener olarak kullanmak, yüzlerce grafiği tek tek açma zahmetini ortadan kaldırıyor.
Kullandığım kodu, TradingView’in Pine Screener ortamında çalışacak şekilde aşağıda bulabilirsiniz. Bu kodu genişletmek elbette mümkün. Kişisel ihtiyaçlarınız ve hayal gücünüz ile sınırlı. İsterseniz bu kod için ekstra alarmlar kurup, istediğiniz koşullar oluştuğunda bilgisayarınıza ve telefonunuza anlık bildiriler de alabilirsiniz…
//@version=5
indicator("Volume Comparison", overlay=false)
// User-configurable inputs
length = input.int(50, "Moving Average Period", minval=1, tooltip="Period for calculating the average volume")
multiplier = input.float(2.0, "Volume Multiplier", minval=0.1, step=0.1, tooltip="Multiplier for comparing volume to average volume")
// Get daily volume
volume_daily = volume
// Calculate average volume
avg_volume = ta.sma(volume_daily, length)
// Comparison: Is current volume at least multiplier times the average volume?
is_high_volume = volume_daily >= avg_volume * multiplier
// Label results
label.new(bar_index, volume_daily, is_high_volume ? "True" : "False",
color=is_high_volume ? color.green : color.red,
style=label.style_label_down,
textcolor=color.white)
// Display results in a table
var table t = table.new(position.top_right, 2, 3, border_width=1)
if barstate.islast
table.cell(t, 0, 0, "Current Volume", bgcolor=color.gray, text_color=color.white)
table.cell(t, 1, 0, str.tostring(volume_daily), bgcolor=color.gray, text_color=color.white)
table.cell(t, 0, 1, "Threshold (Avg Vol * Mult)", bgcolor=color.orange, text_color=color.white)
table.cell(t, 1, 1, str.tostring(avg_volume * multiplier), bgcolor=color.orange, text_color=color.white)
table.cell(t, 0, 2, "Condition", bgcolor=is_high_volume ? color.green : color.red, text_color=color.white)
table.cell(t, 1, 2, is_high_volume ? "True" : "False", bgcolor=is_high_volume ? color.green : color.red, text_color=color.white)
// Alarm conditions
alertcondition(is_high_volume, title="Volume High", message="Volume is at least {{multiplier}}x the average volume")
alertcondition(not is_high_volume, title="Volume Low", message="Volume is below {{multiplier}}x the average volume")
Pine Screener ile oluşturduğum bu sistem, gün içinde tekrar tekrar kullanabileceğiniz bir hacim filtresi sunuyor. Hem kripto hem hisse senedi trade edenler için uygundur. Alışılmadık hacim davranışları benim sistemimin en değerli parçalarından biri. Dolayısıyla bu hareketleri gerçek zamanlı fark etmek, gün içi alım stratejisi içinde oldukça önemli bir yapı taşı.
Bu tür taramaları düzenli yaparak, çoğu kişinin daha yeni fark ettiği hareketleri daha erken yakalayabilirsiniz. Kendi stratejinizin ilk adımı olarak, hacmi bir filtre gibi kullanmak, gereksiz işlemlerinizi azaltır ve sizi yalnızca dikkat çekici fiyat-hacim davranışlarına odaklar.
Sevgiler,
Çağan
Okuduğunuz için teşekkür ederim. Bu gönderi ve “Trading & Life” platformu herkese açıktır, paylaşıp bu platformu destekleyebilir ve yeni içeriklerden haberdar olmak için ücretsiz abone olabilirsiniz...”
*Uyarı: Bu yazıda ve platformda bulunan diğer içeriklerde paylaşımlarımın amacı, finansal okuryazarlığa katkıda bulunmak, piyasalar hakkında farklı bakış açıları sunmak ve özellikle teknik analiz temelli stratejiler konusunda farkındalık yaratmaktır. Bu paylaşımlar, kimseye al-sat tavsiyesi vermek için değil, beni takip edenlerin kendi sistemlerini oluştururken fikir edinmelerine yardımcı olmak için yapılmaktadır. Ayrıca, yatırım tavsiyesi vermeye yetkili olmadığımı da özellikle belirtmek isterim.
Benim kullandığım sistem, yıllarca süren çalışmaların, toplanan verilerin ve defalarca yapılan back testlerin sonucunda, kişiliğime ve beklentilerime göre optimize edilmiş bir stratejidir. Yani tamamen bana özeldir ve bir başkasına %100 uyması mümkün değildir. Burada büyük resmi paylaşsam da, bu resmin altında birçok farklı proses yatmaktadır.
Piyasalar, disiplinsiz ve başkalarının yönlendirmesiyle hareket edenler için oldukça acımasızdır. Amacım, takip edenlerin bilinçsizce işlem yapmasını teşvik etmek değil, tam tersine kendi araştırmalarını yaparak bağımsız kararlar almalarına özendirmektir. Stratejimi anlamaya çalışmak yerine doğrudan işlem açmaya çalışıyorsanız, burada yanlış yerdesiniz. Yatırım, bilgi, sabır ve disiplin gerektirir. Bu bilinçle hareket eden herkes için paylaşımlarımın faydalı olmasını dilerim.
Kodun "Projected Volume" için revize edilmiş hali aşağıdadır. Son dönemde ben bu versiyonu kullanmaya başladım.
//@version=5
indicator("Volume Comparison - Projected Volume-REV01", overlay=false)
// User-configurable inputs
length = input.int(50, "Moving Average Period", minval=1, tooltip="Period for calculating the average volume")
multiplier = input.float(2.0, "Volume Multiplier", minval=0.1, step=0.1, tooltip="Multiplier for comparing volume to average volume")
// Calculate projected volume for the current bar
time_period = ((time_close - time) / 1000)
time_passed = ((timenow - time) / 1000)
time_left = ((time_close - timenow) / 1000)
volume_per_second = 0.0
raw_volume_projected = float(volume) // Keep original projected volume
display_volume_projected = float(volume) // For display with unit conversion
uP = ''
if time_left > 0
volume_per_second := time_passed > 0 ? (volume / time_passed) : 0 // Prevent division by zero
raw_volume_projected := (volume + (volume_per_second * time_left))
display_volume_projected := raw_volume_projected
if display_volume_projected >= 1000 and display_volume_projected < 1000000
display_volume_projected := display_volume_projected / 1000
uP := 'K'
else if display_volume_projected >= 1000000 and display_volume_projected < 1000000000
display_volume_projected := display_volume_projected / 1000000
uP := 'M'
else if display_volume_projected >= 1000000000
display_volume_projected := display_volume_projected / 1000000000
uP := 'B'
// Calculate average volume based on actual volume
avg_volume = ta.sma(volume, length)
// Calculate threshold with unit conversion for display
threshold = avg_volume * multiplier
display_threshold = threshold
uT = ''
if threshold >= 1000 and threshold < 1000000
display_threshold := threshold / 1000
uT := 'K'
else if threshold >= 1000000 and threshold < 1000000000
display_threshold := threshold / 1000000
uT := 'M'
else if threshold >= 1000000000
display_threshold := threshold / 1000000000
uT := 'B'
// Comparison: Use raw (unscaled) projected volume
is_high_volume = raw_volume_projected >= avg_volume * multiplier
// Label results
label.new(bar_index, display_volume_projected, is_high_volume ? "True" : "False",
color=is_high_volume ? color.green : color.red,
style=label.style_label_down,
textcolor=color.white)
// Display results in a table
var table t = table.new(position.top_right, 2, 3, border_width=1)
if barstate.islast
table.cell(t, 0, 0, "Projected Volume", bgcolor=color.gray, text_color=color.white)
table.cell(t, 1, 0, str.tostring(display_volume_projected) + uP, bgcolor=color.gray, text_color=color.white)
table.cell(t, 0, 1, "Threshold (Avg Vol * Mult)", bgcolor=color.orange, text_color=color.white)
table.cell(t, 1, 1, str.tostring(display_threshold) + uT, bgcolor=color.orange, text_color=color.white)
table.cell(t, 0, 2, "Condition", bgcolor=is_high_volume ? color.green : color.red, text_color=color.white)
table.cell(t, 1, 2, is_high_volume ? "True" : "False", bgcolor=is_high_volume ? color.green : color.red, text_color=color.white)
// Alarm conditions
alertcondition(is_high_volume, title="Projected Volume High", message="Projected volume is at least {{multiplier}}x the average volume")
alertcondition(not is_high_volume, title="Projected Volume Low", message="Projected volume is below {{multiplier}}x the average volume")
Mismatched input 'volume_per_second' expecting 'end of line without line continuation' hatasını ben de alıyorum.