C# İle Özel Bir Kripto Para Portföy Takip Uygulaması Nasıl Yapılır?

C# İle Özel Bir Kripto Para Portföy Takip Uygulaması Nasıl Yapılır?
C# İle Özel Bir Kripto Para Portföy Takip Uygulaması Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı standartlarında bir C# uygulaması geliştirmek için aşağıdaki araçlara ihtiyacınız vardır:

  • Visual Studio 2022 (veya üzeri) veya VS Code.
  • .NET 9 SDK: Modern asenkron programlama ve performans iyileştirmeleri için gereklidir.
  • Newtonsoft.Json veya System.Text.Json kütüphanesi: API'den gelen verileri işlemek için kullanılır.
  • Entity Framework Core: Portföy verilerini SQLite veya SQL Server üzerinde tutmak için tercih edilir.
  • CoinGecko veya Binance API Anahtarı: Piyasa verilerine erişim sağlamak için ücretsiz bir API anahtarı temin etmelisiniz.

Projeyi oluşturmak için terminalinize dotnet new console -n KriptoPortfoyTakip komutunu yazarak başlayabilirsiniz. Bu komut, uygulamanızın temel iskeletini oluşturacaktır.

API Entegrasyonu ve Veri Çekme İşlemleri

Kripto para piyasası verileri, dış servislerden gelen JSON formatındaki metinlerle sağlanır. C# içerisinde HttpClient sınıfını kullanarak bu verileri güvenli bir şekilde çekebiliriz. Aşağıdaki kod bloğu, belirli bir kripto paranın anlık fiyatını nasıl çekeceğinizi göstermektedir.

using System.Net.Http.Json;

public class KriptoServis
{
    private readonly HttpClient _httpClient = new HttpClient();

    public async Task FiyatGetir(string coinId)
    {
        // CoinGecko API örneği
        var url = $"https://api.coingecko.com/api/v3/simple/price?ids={coinId}&vs_currencies=try";
        var sonuc = await _httpClient.GetFromJsonAsync(url);
        
        return sonuc[coinId]["try"];
    }
}

Bu kodda HttpClient sınıfını kullanarak asenkron bir istek gönderiyoruz. GetFromJsonAsync metodu, gelen JSON verisini doğrudan C# nesnesine dönüştürerek hata payını azaltır. async/await yapısı, veriler çekilirken uygulamanın donmasını engeller.

Veri Modeli ve Portföy Yapısı

Uygulamanızın temelini oluşturacak olan PortfoyItem sınıfını tanımlamalıyız. Bu sınıf, kullanıcının elinde tuttuğu varlığın miktarını ve sembolünü temsil eder. Veritabanı tutarlılığı için bu modelin temiz olması kritiktir.

public class PortfoyItem
{
    public int Id { get; set; }
    public string Sembol { get; set; } = string.Empty;
    public decimal Miktar { get; set; }
    public decimal AlisFiyati { get; set; }
}

Bu model, Entity Framework Core ile veritabanına kaydedilecek temel yapıdır. Sembol alanı, API'den veri çekerken kullanılacak anahtar değerdir.

Veritabanı Yönetimi ve Entity Framework Core

Verilerin kalıcı olması için bir veritabanı bağlamı (DbContext) oluşturmalıyız. SQLite, küçük ölçekli portföy uygulamaları için idealdir çünkü kurulum gerektirmez ve tek bir dosya üzerinde çalışır.

using Microsoft.EntityFrameworkCore;

public class PortfoyDbContext : DbContext
{
    public DbSet Portfoy { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite("Data Source=portfoy.db");
}

Bu yapılandırma ile Portfoy tablosu üzerinden verilerinizi ekleyebilir, güncelleyebilir ve silebilirsiniz. OnConfiguring metodu, uygulamanın veritabanı dosyasını nerede arayacağını belirtir.

Portföy Değerleme Mantığı

Kullanıcının toplam varlığının TL cinsinden değerini hesaplamak için, veritabanındaki her bir varlığı döngüye alıp güncel fiyatla çarpmamız gerekir. Bu işlem, uygulamanızın en kritik hesaplama kısmıdır.

public async Task ToplamDegerHesapla(List varliklar)
{
    decimal toplam = 0;
    var servis = new KriptoServis();

    foreach (var varlik in varliklar)
    {
        var guncelFiyat = await servis.FiyatGetir(varlik.Sembol);
        toplam += guncelFiyat * varlik.Miktar;
    }
    return toplam;
}

Burada her varlık için ayrı bir API isteği atılmaktadır. Ancak çok sayıda varlığınız varsa, API limitlerine takılmamak için toplu veri çeken uç noktaları (batch request) kullanmanız önerilir.

Uygulama Karşılaştırma Tablosu

Yöntem Avantaj Dezavantaj
SQLite Hızlı, kurulumsuz, taşınabilir Çok kullanıcılı sistemlerde yavaş
SQL Server Kurumsal ölçeklenebilirlik Kurulum ve yönetim maliyeti
JSON Dosyası Basit, hızlı prototipleme Veri bütünlüğü riski yüksek
Kritik Güvenlik Uyarısı: API anahtarlarınızı hiçbir zaman kod içerisinde "hard-coded" (doğrudan metin olarak) bırakmayın. Ortam değişkenlerini (Environment Variables) veya appsettings.json dosyasını kullanarak anahtarlarınızı şifreli bir şekilde saklayın. Aksi takdirde, kodunuzu GitHub gibi platformlara yüklerseniz anahtarınız çalınabilir.

Sıkça Sorulan Sorular

API'den gelen veriler neden hatalı görünüyor?

API'den gelen verilerin null olup olmadığını kontrol edin. Ayrıca, kullandığınız API'nin limitlerini (rate limiting) aşmış olabilirsiniz. try-catch blokları ile hata yönetimini mutlaka ekleyin.

Uygulamayı nasıl daha hızlı hale getirebilirim?

Her varlık için ayrı API isteği atmak yerine, toplu fiyat bilgisi sağlayan uç noktaları kullanın. Ayrıca, verileri bellekte (cache) belirli bir süre tutarak gereksiz istekleri engelleyin.

Veritabanı bağlantısı neden başarısız oluyor?

Entity Framework Core kullanırken dotnet ef migrations add InitialCreate ve dotnet ef database update komutlarını çalıştırdığınızdan emin olun. Bu, veritabanı şemasının oluşturulmasını sağlar.

Neden SQLite tercih etmeliyim?

Kişisel bir portföy uygulaması için sunucu yönetimiyle uğraşmak istemezsiniz. SQLite, dosya tabanlı olduğu için uygulamanızın yedeğini almak sadece bir dosyayı kopyalamak kadar kolaydır.

Uygulama güvenliğini nasıl artırabilirim?

Kullanıcı girişleri ekleyecekseniz şifreleri asla düz metin olarak saklamayın. BCrypt.Net kütüphanesini kullanarak şifreleri hash'leyerek (karma hale getirerek) veritabanına kaydedin.

Finansal Sorumluluk Reddi: Bu makale tamamen yazılım geliştirme tekniklerini öğretmeyi amaçlamaktadır. Uygulamanızın hesapladığı veriler, piyasa dalgalanmaları ve API gecikmeleri nedeniyle farklılık gösterebilir. Bu uygulama herhangi bir yatırım tavsiyesi değildir ve finansal kararlarınızda kullanılamaz.

Uygulama Performansını Artırmak İçin İleri Düzey Önbellekleme Stratejileri

Kripto para portföy uygulamalarında en büyük darboğaz, her veri çekme isteğinde dış API'ye yapılan çağrılardır. API sağlayıcılarının genellikle hız sınırlamaları (rate limiting) olduğu düşünülürse, IMemoryCache kullanarak verileri bellekte tutmak uygulamanızın yanıt süresini milisaniyelere indirecektir.

Aşağıdaki örnekte, fiyat verilerini 60 saniye boyunca bellekte tutan ve API yükünü azaltan bir servis yapısını görebilirsiniz:

using Microsoft.Extensions.Caching.Memory;

public class CryptoPriceService
{
    private readonly IMemoryCache _cache;
    private const string CacheKey = "CryptoPrices";

    public CryptoPriceService(IMemoryCache cache)
    {
        _cache = cache;
    }

    public async Task GetPriceAsync(string symbol)
    {
        if (!_cache.TryGetValue(CacheKey, out Dictionary prices))
        {
            // API'den veriyi çek
            prices = await FetchPricesFromApi();
            
            var cacheOptions = new MemoryCacheEntryOptions()
                .SetAbsoluteExpiration(TimeSpan.FromSeconds(60));
            
            _cache.Set(CacheKey, prices, cacheOptions);
        }
        return prices[symbol];
    }
}

Uygulamanın Dağıtımı (Deployment) ve Docker Entegrasyonu

Geliştirdiğiniz C# uygulamasını yerel makinenizden çıkarıp sunucu ortamına taşırken, bağımlılıkları yönetmek için Docker kullanmak en profesyonel yaklaşımdır. Bu sayede veritabanı sürücüleri veya .NET çalışma zamanı uyumsuzlukları gibi sorunları ortadan kaldırırsınız.

Uygulamanız için temel bir Dockerfile yapısı şu şekilde olmalıdır:

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
COPY . .
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/runtime:8.0
WORKDIR /app
COPY --from=build /app/out .
ENTRYPOINT ["dotnet", "CryptoPortfolioApp.dll"]

Deployment Öncesi Kontrol Listesi

  • Environment Variables: API anahtarlarınızı asla kod içinde saklamayın; appsettings.json yerine ortam değişkenlerini (Environment Variables) kullanın.
  • Logging: Uygulamanın arka planda ne yaptığını takip etmek için Serilog gibi bir kütüphane ile loglama mekanizması kurun.
  • Database Migration: Uygulama ilk kez çalıştığında veritabanı şemasının otomatik oluşması için context.Database.Migrate(); komutunu program başlangıcına ekleyin.

Hata Ayıklama ve İzlenebilirlik (Debugging)

Portföy uygulamalarında en sık karşılaşılan hata, API'den gelen JSON verisinin model ile eşleşmemesidir. Bu tür durumları izlemek için System.Text.Json kütüphanesinin hata ayıklama özelliklerinden faydalanın. Eğer API yanıtı beklediğinizden farklı geliyorsa, ham yanıtı bir dosyaya yazdırarak incelemek sorunu hızla çözmenizi sağlar.

İpucu: API çağrılarınızda HttpClient nesnesini her seferinde oluşturmak yerine IHttpClientFactory kullanarak soket tükenmesi (socket exhaustion) sorunlarının önüne geçin.

Sonuç

C# ile özel bir kripto para portföy takip uygulaması geliştirmek, modern .NET ekosisteminin gücünü ve esnekliğini anlamak için harika bir projedir. Bu rehberde; API entegrasyonu, veritabanı yönetimi ve asenkron programlama temellerini ele aldık. Uygulamanızı bir sonraki aşamaya taşımak için bir arayüz (WPF veya Blazor) eklemeyi düşünebilirsiniz. Yazılım dünyasında öğrenme süreci hiç bitmez; bir sonraki adımınız, uygulamanıza fiyat alarmı kurma özelliği eklemek veya verileri görselleştiren grafik kütüphanelerini entegre etmek olabilir.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Mutfak pratikleri ve organizasyonel hayat tüyoları üzerine uzman bir içerik üreticisiyim. Günlük rutinleri optimize eden yöntemleri, anlaşılır ve uygulanabilir rehberler haline getiriyorum.

Yorumlar (0)

Yorum Yaz