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_indeğ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.