Kod Örnekleri

C# ve Python dillerinde kullanıma hazır kod örnekleri.

C# / .NET

.NET'te HttpClient kullanarak örnek:

Kimlik Doğrulama & Sembol Listeleri Alma

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;

public class TradeWiseClient
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;
    private string _jwtToken;
    private string _refreshToken;
    private DateTimeOffset _accessTokenExpiresAt = DateTimeOffset.MinValue;

    public TradeWiseClient(string apiKey)
    {
        _apiKey = apiKey;
        _httpClient = new HttpClient
        {
            BaseAddress = new Uri("https://devapi.tradewise.com.tr")
        };
    }

    // Authenticate with API key and get the first token set
    public async Task AuthenticateAsync()
    {
        var request = new HttpRequestMessage(HttpMethod.Post, "/oauth/token");
        request.Headers.Add("X-API-Key", _apiKey);
        
        var body = new { grant_type = "api_key" };
        request.Content = new StringContent(
            JsonSerializer.Serialize(body),
            System.Text.Encoding.UTF8,
            "application/json"
        );

        var response = await _httpClient.SendAsync(request);
        
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine($"Authentication failed: {response.StatusCode}");
            return false;
        }

        var content = await response.Content.ReadAsStringAsync();
        var tokenResponse = JsonSerializer.Deserialize(content);

        StoreTokens(tokenResponse);
        Console.WriteLine("✅ Authentication successful");
        return true;
    }

    // Refresh access token without sending the API key again
    public async Task RefreshTokenAsync()
    {
        if (string.IsNullOrWhiteSpace(_refreshToken))
            return await AuthenticateAsync();

        var body = new { grant_type = "refresh_token", refresh_token = _refreshToken };
        var request = new HttpRequestMessage(HttpMethod.Post, "/oauth/token")
        {
            Content = new StringContent(
                JsonSerializer.Serialize(body),
                System.Text.Encoding.UTF8,
                "application/json"
            )
        };

        var response = await _httpClient.SendAsync(request);
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine($"Token refresh failed: {response.StatusCode}");
            return await AuthenticateAsync();
        }

        var content = await response.Content.ReadAsStringAsync();
        var tokenResponse = JsonSerializer.Deserialize(content);

        StoreTokens(tokenResponse);
        Console.WriteLine("🔄 Token refreshed");
        return true;
    }

    private async Task EnsureAccessTokenAsync()
    {
        if (string.IsNullOrWhiteSpace(_jwtToken))
        {
            if (!await AuthenticateAsync())
                throw new InvalidOperationException("Authentication failed.");
            return;
        }

        if (_accessTokenExpiresAt <= DateTimeOffset.UtcNow.AddMinutes(5))
        {
            if (!await RefreshTokenAsync())
                throw new InvalidOperationException("Token refresh failed.");
        }
    }

    private void StoreTokens(TokenResponse tokenResponse)
    {
        if (tokenResponse?.AccessToken is null)
            throw new InvalidOperationException("Token response is invalid.");

        _jwtToken = tokenResponse.AccessToken;
        _refreshToken = tokenResponse.RefreshToken;
        _accessTokenExpiresAt = DateTimeOffset.UtcNow.AddSeconds(tokenResponse.ExpiresIn);
    }

    // Get symbol lists
    public async Task GetSymbolListsAsync()
    {
        await EnsureAccessTokenAsync();

        var request = new HttpRequestMessage(HttpMethod.Get, "/api/v1/symbol-lists");
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _jwtToken);

        var response = await _httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();

        return await response.Content.ReadAsStringAsync();
    }
}

// Token response model
public class TokenResponse
{
    [JsonPropertyName("access_token")]
    public string AccessToken { get; set; }

    [JsonPropertyName("token_type")]
    public string TokenType { get; set; }

    [JsonPropertyName("expires_in")]
    public int ExpiresIn { get; set; }

    [JsonPropertyName("refresh_token")]
    public string RefreshToken { get; set; }

    [JsonPropertyName("refresh_expires_in")]
    public int RefreshExpiresIn { get; set; }
}

// Usage
class Program
{
    static async Task Main(string[] args)
    {
        var apiKey = Environment.GetEnvironmentVariable("TRADEWISE_API_KEY");
        var client = new TradeWiseClient(apiKey);

        // Authenticate
        if (await client.AuthenticateAsync())
        {
            // Get symbol lists
            var symbolLists = await client.GetSymbolListsAsync();
            Console.WriteLine($"Symbol Lists: {symbolLists}");
        }
    }
}

Python

requests kütüphanesini kullanarak örnek:

Gereksinimleri Yükle

pip install requests python-dotenv

Tam Örnek

import os
import requests
from datetime import datetime, timedelta, timezone
from typing import Optional, Dict, Any
from dotenv import load_dotenv

load_dotenv()

class TradeWiseClient:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://devapi.tradewise.com.tr"
        self.jwt_token: Optional[str] = None
        self.refresh_token: Optional[str] = None
        self.access_token_expires_at = datetime.min.replace(tzinfo=timezone.utc)

    def authenticate(self) -> bool:
        """Authenticate with API key and get the first token set"""
        url = f"{self.base_url}/oauth/token"
        headers = {
            "X-API-Key": self.api_key,
            "Content-Type": "application/json"
        }
        body = {"grant_type": "api_key"}
        
        try:
            response = requests.post(url, headers=headers, json=body)
            response.raise_for_status()
            
            data = response.json()
            self._store_tokens(data)
            print("✅ Authentication successful")
            return True
        except requests.exceptions.RequestException as e:
            print(f"❌ Authentication failed: {e}")
            return False

    def refresh_access_token(self) -> bool:
        """Refresh access token without sending the API key again"""
        if not self.refresh_token:
            return self.authenticate()

        url = f"{self.base_url}/oauth/token"
        body = {
            "grant_type": "refresh_token",
            "refresh_token": self.refresh_token
        }

        try:
            response = requests.post(url, json=body, headers={"Content-Type": "application/json"})
            response.raise_for_status()

            data = response.json()
            self._store_tokens(data)
            print("🔄 Token refreshed")
            return True
        except requests.exceptions.RequestException as e:
            print(f"❌ Token refresh failed: {e}")
            return self.authenticate()

    def _store_tokens(self, data: Dict[str, Any]) -> None:
        self.jwt_token = data["access_token"]
        self.refresh_token = data.get("refresh_token")
        self.access_token_expires_at = datetime.now(timezone.utc) + timedelta(seconds=data.get("expires_in", 86400))

    def _ensure_token(self) -> None:
        if not self.jwt_token:
            if not self.authenticate():
                raise ValueError("Authentication failed.")
            return

        if self.access_token_expires_at <= datetime.now(timezone.utc) + timedelta(minutes=5):
            if not self.refresh_access_token():
                raise ValueError("Token refresh failed.")

    def _get_headers(self) -> Dict[str, str]:
        """Get authenticated headers"""
        self._ensure_token()
        return {
            "Authorization": f"Bearer {self.jwt_token}",
            "Content-Type": "application/json"
        }

    def get_symbol_lists(self) -> Dict[str, Any]:
        """Get all symbol lists"""
        url = f"{self.base_url}/api/v1/symbol-lists"
        response = requests.get(url, headers=self._get_headers())
        response.raise_for_status()
        return response.json()

    def create_symbol_list(self, name: str, symbols: list) -> Dict[str, Any]:
        """Create a new symbol list"""
        url = f"{self.base_url}/api/v1/symbol-lists"
        data = {"name": name, "symbols": symbols}
        response = requests.post(url, json=data, headers=self._get_headers())
        response.raise_for_status()
        return response.json()

    def get_symbol_info(self, symbol: str) -> Dict[str, Any]:
        """Get symbol information"""
        url = f"{self.base_url}/api/v1/symbols/{symbol}"
        response = requests.get(url, headers=self._get_headers())
        response.raise_for_status()
        return response.json()


# Usage example
def main():
    api_key = os.getenv("TRADEWISE_API_KEY")
    client = TradeWiseClient(api_key)

    # Authenticate
    if client.authenticate():
        # Get symbol lists
        symbol_lists = client.get_symbol_lists()
        print(f"Symbol Lists: {symbol_lists}")

        # Create a new symbol list
        new_list = client.create_symbol_list(
            name="Teknoloji Hisseleri",
            symbols=["ASELS", "LOGO", "NETAS"]
        )
        print(f"Created List: {new_list}")

        # Get symbol info
        symbol_info = client.get_symbol_info("ASELS")
        print(f"Symbol Info: {symbol_info}")


if __name__ == "__main__":
    main()

Günlük Emirleri Görüntüleme

Bir hesaptaki günlük emirleri listelemek için kullanılır. Bekleyen ve tamamlanmış emirleri içerir.

Not: Bu API, belirtilen hesap numarasındaki tüm günlük emirleri döndürür. BuySell değeri 1 alış, 2 satış emirini temsil eder. Zincir emirler orderStatus değerinde "Chain" koduyla görünür.

C# Örneği

// Günlük emirleri getirme metodu ekleyin
public async Task GetDailyOrdersAsync(
    string brokerageCode,
    string accountNumber)
{
    var request = new HttpRequestMessage(HttpMethod.Post, "/api/v1/accounts/daily-orders");
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _jwtToken);
    
    var body = new
    {
        brokerageCode = brokerageCode,
        accountNumber = accountNumber
    };
    
    request.Content = new StringContent(
        JsonSerializer.Serialize(body),
        System.Text.Encoding.UTF8,
        "application/json"
    );

    var response = await _httpClient.SendAsync(request);
    response.EnsureSuccessStatusCode();

    return await response.Content.ReadAsStringAsync();
}

// Kullanım örneği
var dailyOrders = await client.GetDailyOrdersAsync(
    brokerageCode: "TradeWiseYatirim",
    accountNumber: "123456"
);
Console.WriteLine($"Daily Orders: {dailyOrders}");

Python Örneği

def get_daily_orders(
    self,
    brokerage_code: str,
    account_number: str
) -> Dict[str, Any]:
    """Günlük emirleri getir"""
    url = f"{self.base_url}/api/v1/accounts/daily-orders"
    data = {
        "brokerageCode": brokerage_code,
        "accountNumber": account_number
    }
    response = requests.post(url, json=data, headers=self._get_headers())
    response.raise_for_status()
    return response.json()

# Kullanım örneği
daily_orders = client.get_daily_orders(
    brokerage_code="TradeWiseYatirim",
    account_number="123456"
)
print(f"Daily Orders: {daily_orders}")

Request Body Parametreleri

Parametre Tip Açıklama
brokerageCode string Aracı kurum ID
accountNumber string Hesap numarası

Başarılı Yanıt Örneği

{
  "success": true,
  "data": [
    {
      "orderNo": "305344701",
      "symbol": "ADESE",
      "quantity": 100,
      "buySell": 1,
      "orderStatus": "Pending",
      "description": ""
    },
    {
      "orderNo": "305344702",
      "symbol": "THYAO",
      "quantity": 50,
      "buySell": 2,
      "orderStatus": "Completed",
      "description": ""
    },
    {
      "orderNo": "305344703",
      "symbol": "EREGL",
      "quantity": 75,
      "buySell": 1,
      "orderStatus": "Chain",
      "description": "Zincir emir"
    }
  ],
  "message": "Success"
}

Response Data Alanları

Alan Tip Açıklama
orderNo string Emir numarası
symbol string Sembol kodu (örn: ADESE, THYAO)
quantity number Miktar (lot)
buySell number 1 = Alış, 2 = Satış
orderStatus string Emir durumu (Pending, Waiting, Completed, Cancelled, Rejected, Chain)
description string Ek açıklama

Zincir Emir Gönderme

Zincir emir, bir referans emre bağlı olarak gerçekleşen emirlerdir. Aşağıda tüm dillerde örnekler bulabilirsiniz.

Not: priceType değeri 1 ise market emir (price 0 olacak), priceType değeri 2 ise limit emir (price girilecek).

C# Örneği

// Zincir emir gönderme metodu ekleyin
public async Task SendChainOrderAsync(
    string accountNumber,
    string brokerageCode,
    string symbol,
    decimal quantity,
    int buySell,
    decimal price,
    string referenceOrderNo,
    string priceType)
{
    var request = new HttpRequestMessage(HttpMethod.Post, "/api/v1/orders/chain");
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _jwtToken);
    
    var body = new
    {
        accountNumber = accountNumber,
        brokerageCode = brokerageCode,
        symbol = symbol,
        quantity = quantity,
        buySell = buySell,
        price = price,
        referenceOrderNo = referenceOrderNo,
        priceType = priceType
    };
    
    request.Content = new StringContent(
        JsonSerializer.Serialize(body),
        System.Text.Encoding.UTF8,
        "application/json"
    );

    var response = await _httpClient.SendAsync(request);
    response.EnsureSuccessStatusCode();

    return await response.Content.ReadAsStringAsync();
}

// Kullanım örneği (Market emir)
var marketOrderResult = await client.SendChainOrderAsync(
    accountNumber: "123456",
    brokerageCode: "TradeWiseYatirim",
    symbol: "ADESE",
    quantity: 1,
    buySell: 1, // 1 = Alış, 2 = Satış
    price: 0,
    referenceOrderNo: "305344701",
    priceType: "1" // Market emir
);

// Kullanım örneği (Limit emir)
var limitOrderResult = await client.SendChainOrderAsync(
    accountNumber: "123456",
    brokerageCode: "TradeWiseYatirim",
    symbol: "ADESE",
    quantity: 1,
    buySell: 1,
    price: 1.5M,
    referenceOrderNo: "305344701",
    priceType: "2" // Limit emir
);

Python Örneği

def send_chain_order(
    self,
    brokerage_code: str,
    symbol: str,
    quantity: int,
    buy_sell: int,
    price: float,
    reference_order_no: str,
    price_type: str,
    account_number: str
) -> Dict[str, Any]:
    """Zincir emir gönder"""
    url = f"{self.base_url}/api/v1/orders/chain"
    data = {
        "accountNumber": account_number,
        "brokerageCode": brokerage_code,
        "symbol": symbol,
        "quantity": quantity,
        "buySell": buy_sell,
        "price": price,
        "referenceOrderNo": reference_order_no,
        "priceType": price_type
    }
    response = requests.post(url, json=data, headers=self._get_headers())
    response.raise_for_status()
    return response.json()

# Kullanım örneği (Market emir)
market_order = client.send_chain_order(
    account_number="123456",
    brokerage_code="TradeWiseYatirim",
    symbol="ADESE",
    quantity=1,
    buy_sell=1,  # 1 = Alış, 2 = Satış
    price=0,
    reference_order_no="305344701",
    price_type="1"  # Market emir
)

# Kullanım örneği (Limit emir)
limit_order = client.send_chain_order(
    account_number="123456",
    brokerage_code="TradeWiseYatirim",
    symbol="ADESE",
    quantity=1,
    buy_sell=1,
    price=1.5,
    reference_order_no="305344701",
    price_type="2"  # Limit emir
)

Request Body Parametreleri

Parametre Tip Açıklama
accountNumber string Hesap numarası (string, zorunlu)
brokerageCode string Aracı kurum ID
symbol string Sembol kodu (örn: ADESE, THYAO)
quantity number Miktar (lot)
buySell number 1 = Alış, 2 = Satış
price number Fiyat (market emirde 0, limit emirde fiyat değeri)
referenceOrderNo string Referans emir numarası (zincirin bağlı olduğu emir)
priceType string "1" = Market emir, "2" = Limit emir

Başarılı Yanıt Örneği

{
  "success": true,
  "data": {
    "orderNo": "123456789",
    "referenceOrderNo": "305344701",
    "orderStatus": "Pending",
    "message": "Zincir emir başarıyla gönderildi"
  }
}

En İyi Uygulamalar

  • Kimlik bilgilerini güvenli saklayın

    Ortam değişkenlerini veya güvenli kasaları kullanın, API anahtarlarını asla kodlamayın.

  • Hata işlemeyi uygulayın

    Her zaman HTTP hatalarını işleyin ve üstel geri çekilme ile yeniden deneme mantığı uygulayın.

  • JWT token'ları önbelleğe alın

    Developer API access token'ları 24 saat geçerlidir. Gereksiz kimlik doğrulama isteklerinden kaçınmak için token'ı expires_in değerine göre önbelleğe alın ve süresi dolmadan refresh token ile yenileyin.

  • İstek limitlerini gözetin

    İstek limiti header'larını izleyin ve limitlere yaklaşırken yavaşlayın.

Daha Fazla Yardıma mı İhtiyacınız Var?