اگر یه توسعهدهندهی ایرانی هستی که روی پروژههای مرتبط با ارز دیجیتال کار میکنی، احتمالاً بارها با این سوال روبرو شدی: «چطور میتونم از سی شارپ به API بایننس وصل بشم؟»
تو این مقاله، قدم به قدم باهات میریم سراغ این موضوع. از ساختن API Key گرفته تا نوشتن کد واقعی برای دریافت قیمت لحظهای، موجودی حساب و ثبت سفارش. پس اگه آمادهای، بریم!
API بایننس (Binance API) یک رابط برنامهنویسی است که صرافی بایننس در اختیار توسعهدهندگان قرار میدهد. با این API میتوانی:
بایننس دو نوع API اصلی دارد: REST API که برای درخواستهای معمولی استفاده میشود و WebSocket API که برای دریافت دادههای لحظهای و استریم قیمت کاربرد دارد. در این آموزش هر دو را بررسی میکنیم.
قبل از شروع کدنویسی، به چند چیز نیاز داری:
برای ساخت API Key مراحل زیر را دنبال کن:
⚠️ هشدار مهم: Secret Key را فقط یک بار میتوانی ببینی. اگر آن را ذخیره نکنی، باید API جدید بسازی. همچنین هیچوقت این کلیدها را در کد یا گیتهاب قرار نده!
برای کار با API بایننس در سی شارپ، بهترین کتابخانهای که وجود داره Binance.Net هست. این کتابخانه یک Wrapper قدرتمند برای API بایننس است که کار رو خیلی سادهتر میکنه.
در Package Manager Console ویژوال استودیو تایپ کن:
Install-Package Binance.Net Install-Package CryptoExchange.Net
یا با dotnet CLI:
dotnet add package Binance.Net dotnet add package CryptoExchange.Net
بریم سراغ اولین کد! این سادهترین مثال برای دریافت قیمت لحظهای بیتکوین به دلار است:
using Binance.Net.Clients;
using CryptoExchange.Net.Authentication;
class Program
{
static async Task Main(string[] args)
{
// ساخت کلاینت بایننس
var client = new BinanceRestClient();
// دریافت قیمت لحظهای بیتکوین
var result = await client.SpotApi.ExchangeData
.GetPriceAsync(“BTCUSDT”);
if (result.Success)
{
Console.WriteLine($“قیمت بیتکوین: {result.Data.Price} USDT”);
}
else
{
Console.WriteLine($“خطا: {result.Error?.Message}”);
}
}
}
اگه کد بالا رو اجرا کنی، قیمت لحظهای BTC/USDT رو توی کنسول میبینی. این اولین قدم موفقیتآمیز توئه!
برای دسترسی به اطلاعات حساب کاربری مثل موجودی یا ثبت سفارش، باید API Key خودت رو تنظیم کنی. این کار رو میتوانی با Dependency Injection یا بهصورت مستقیم انجام بدی:
using Binance.Net.Clients;
using CryptoExchange.Net.Authentication;
class Program
{
static async Task Main(string[] args)
{
// تنظیم API Key - هیچوقت در کد هاردکد نکن!
// از appsettings.json یا Environment Variables استفاده کن
string apiKey = “YOUR_API_KEY_HERE”;
string secretKey = “YOUR_SECRET_KEY_HERE”;
var client = new BinanceRestClient(options =>
{
options.ApiCredentials = new ApiCredentials(apiKey, secretKey);
});
// دریافت موجودی حساب
var accountInfo = await client.SpotApi.Account
.GetAccountInfoAsync();
if (accountInfo.Success)
{
Console.WriteLine(“=== موجودی حساب ===”);
foreach (var balance in accountInfo.Data.Balances)
{
if (balance.Available > 0)
{
Console.WriteLine($"{balance.Asset}: " +
$"موجود = {balance.Available}, " +
$“قفلشده = {balance.Locked}”);
}
}
}
else
{
Console.WriteLine($“خطا: {accountInfo.Error?.Message}”);
}
}
}
هیچوقت API Key رو مستقیم توی کد ننویس! از appsettings.json استفاده کن:
// appsettings.json
{
“BinanceSettings”: {
“ApiKey”: “your_api_key”,
“SecretKey”: “your_secret_key”
}
}
// Program.cs
using Microsoft.Extensions.Configuration;
var config = new ConfigurationBuilder()
.AddJsonFile(“appsettings.json”)
.Build();
string apiKey = config[“BinanceSettings:ApiKey”]!;
string secretKey = config[“BinanceSettings:SecretKey”]!;
یکی از پرکاربردترین عملیاتها در تحلیل تکنیکال، دریافت کندلهای قیمتی (Candlestick) است. با کد زیر میتونی این دادهها رو بگیری:
using Binance.Net.Enums;
// دریافت کندلهای ۱ ساعته بیتکوین (۱۰۰ کندل آخر)
var klines = await client.SpotApi.ExchangeData
.GetKlinesAsync(
“BTCUSDT”,
KlineInterval.OneHour,
limit: 100
);
if (klines.Success)
{
Console.WriteLine(“=== کندلهای قیمتی BTC/USDT ===”);
foreach (var kline in klines.Data)
{
Console.WriteLine(
$"زمان: {kline.OpenTime:yyyy-MM-dd HH:mm} | " +
$"باز: {kline.OpenPrice} | " +
$"بالا: {kline.HighPrice} | " +
$"پایین: {kline.LowPrice} | " +
$"بسته: {kline.ClosePrice} | " +
$“حجم: {kline.Volume}”
);
}
}
حالا میریم سراغ بخش هیجانانگیزتر: ثبت سفارش واقعی. بایننس چند نوع سفارش دارد که مهمترین آنها عبارتند از:
using Binance.Net.Enums;
// ⚠️ این کد سفارش واقعی ثبت میکند - با احتیاط استفاده کنید!
// ثبت سفارش خرید Limit
var orderResult = await client.SpotApi.Trading
.PlaceOrderAsync(
symbol: “BTCUSDT”,
side: OrderSide.Buy,
type: SpotOrderType.Limit,
quantity: 0.001m, // مقدار
price: 40000m, // قیمت هدف
timeInForce: TimeInForce.GoodTillCanceled
);
if (orderResult.Success)
{
Console.WriteLine($“سفارش ثبت شد!”);
Console.WriteLine($“شناسه سفارش: {orderResult.Data.Id}”);
Console.WriteLine($“وضعیت: {orderResult.Data.Status}”);
}
else
{
Console.WriteLine($“خطا در ثبت سفارش: {orderResult.Error?.Message}”);
}
// لغو سفارش
var cancelResult = await client.SpotApi.Trading
.CancelOrderAsync(“BTCUSDT”, orderResult.Data.Id);
if (cancelResult.Success)
Console.WriteLine(“سفارش با موفقیت لغو شد.”);
اگه نیاز داری قیمتها رو بهصورت لحظهای و پیوسته دریافت کنی (مثلاً برای ساخت داشبورد لایو)، باید از WebSocket استفاده کنی:
using Binance.Net.Clients;
var socketClient = new BinanceSocketClient();
// سابسکرایب به استریم قیمت لحظهای BTC
var subscription = await socketClient.SpotApi
.SubscribeToTickerUpdatesAsync(
“BTCUSDT”,
data =>
{
Console.WriteLine(
$"[{DateTime.Now:HH:mm:ss}] " +
$"BTC/USDT = {data.Data.LastPrice:N2} | " +
$“تغییر: {data.Data.PriceChangePercent:N2}%”
);
}
);
if (subscription.Success)
{
Console.WriteLine(“اتصال WebSocket برقرار شد. Ctrl+C برای خروج…”);
Console.ReadLine();
}
// قطع اتصال
await socketClient.UnsubscribeAllAsync();
// دریافت قیمت چندین ارز بهصورت همزمان
var symbols = new[] { “BTCUSDT”, “ETHUSDT”, “BNBUSDT” };
var multiSub = await socketClient.SpotApi
.SubscribeToTickerUpdatesAsync(
symbols,
data =>
{
Console.WriteLine(
$“{data.Data.Symbol}: {data.Data.LastPrice:N2}”
);
}
);
همینطور که داری این مقاله رو میخونی، رقبای شما دارن با سئوی حرفهای مشتریان بیشتری جذب میکنن. سئوی سایت شما یک سرمایهگذاری مطمئن برای افزایش فروش است. سئوی سایت خود را به متخصصان ما بسپارید.
📞 همین حالا برای مشاوره رایگان با ما تماس بگیرید:
09190994063 | 09376846692
در یک پروژه واقعی، مدیریت خطا خیلی مهمه. بایننس محدودیتهای نرخ (Rate Limit) داره و گاهی اتصال قطع میشه. یه کلاس کمکی برای این کار:
public class BinanceService
{
private readonly BinanceRestClient _client;
private readonly ILogger _logger;
public BinanceService(string apiKey, string secretKey,
ILogger logger)
{
_logger = logger;
_client = new BinanceRestClient(options =>
{
options.ApiCredentials =
new ApiCredentials(apiKey, secretKey);
// تنظیم Timeout
options.RequestTimeout = TimeSpan.FromSeconds(30);
});
}
public async Task GetPriceWithRetryAsync(
string symbol, int maxRetries = 3)
{
for (int attempt = 1; attempt <= maxRetries; attempt++)
{
try
{
var result = await _client.SpotApi
.ExchangeData.GetPriceAsync(symbol);
if (result.Success)
return result.Data.Price;
_logger.LogWarning(
$"تلاش {attempt}/{maxRetries} ناموفق: " +
$“{result.Error?.Message}”);
// اگه Rate Limit بود کمی صبر کن
if (result.Error?.Code == 429)
await Task.Delay(TimeSpan.FromSeconds(60));
else
await Task.Delay(TimeSpan.FromSeconds(attempt * 2));
}
catch (Exception ex)
{
_logger.LogError(
$“خطای استثنا در تلاش {attempt}: {ex.Message}”);
await Task.Delay(TimeSpan.FromSeconds(attempt * 2));
}
}
return null;
}
}
قبل از اینکه با پول واقعی کار کنی، حتماً روی Testnet بایننس تست کن. Testnet یه محیط شبیهسازیشدهست که پول مجازی بهت میده:
// اتصال به Testnet بهجای بازار واقعی
var testnetClient = new BinanceRestClient(options =>
{
options.ApiCredentials =
new ApiCredentials(testnetApiKey, testnetSecretKey);
// این خط مهم است - تنظیم محیط Testnet
options.Environment = BinanceEnvironment.Testnet;
});
Console.WriteLine(“متصل به Testnet - پول واقعی در خطر نیست!”);
برای دریافت API Key مربوط به Testnet، به آدرس testnet.binance.vision برو و یه حساب جداگانه بساز.
حالا بریم همه چیزی که یاد گرفتیم رو ترکیب کنیم و یه ربات ساده بسازیم که اگر قیمت از یه حد مشخص پایینتر رفت، خرید کنه:
public class SimpleTradingBot
{
private readonly BinanceRestClient _client;
private readonly decimal _buyThreshold;
private readonly string _symbol;
public SimpleTradingBot(BinanceRestClient client,
string symbol, decimal buyThreshold)
{
_client = client;
_symbol = symbol;
_buyThreshold = buyThreshold;
}
public async Task RunAsync(CancellationToken ct)
{
Console.WriteLine($“ربات برای {_symbol} شروع به کار کرد.”);
Console.WriteLine($“حد خرید: {_buyThreshold:N2} USDT”);
while (!ct.IsCancellationRequested)
{
var price = await _client.SpotApi.ExchangeData
.GetPriceAsync(_symbol);
if (!price.Success)
{
await Task.Delay(5000, ct);
continue;
}
decimal currentPrice = price.Data.Price;
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] " +
$“قیمت: {currentPrice:N2}”);
// منطق خرید
if (currentPrice <= _buyThreshold)
{
Console.WriteLine($"🟢 سیگنال خرید! " +
$“قیمت {currentPrice} به حد {_buyThreshold} رسید.”);
// اینجا میتونی سفارش ثبت کنی
// await PlaceMarketBuyOrder(_symbol, 0.001m);
}
// بررسی هر ۱۰ ثانیه یک بار
await Task.Delay(10000, ct);
}
}
}
// استفاده از ربات
var cts = new CancellationTokenSource();
var bot = new SimpleTradingBot(client, “BTCUSDT”, 40000m);
await bot.RunAsync(cts.Token);
اگه میخوای ربات معاملاتی تو همیشه آنلاین باشه، باید اون رو روی یه سرور ابری (VPS) دیپلوی کنی. سرویسهایی مثل Azure، AWS یا حتی سرورهای ایرانی برای این کار مناسبند. کد سی شارپ رو میتونی بهصورت یه Windows Service یا Docker Container روی سرور اجرا کنی.
در این مقاله جامع یاد گرفتیم:
اتصال به API بایننس با سی شارپ دریچهای به دنیای خودکارسازی معاملات باز میکنه. با تسلط بر این مهارت میتونی رباتهای معاملاتی پیشرفته، سیستمهای تحلیل بازار و داشبوردهای لایو بسازی.
همانطور که یک ربات معاملاتی هوشمند میتواند سود شما را چند برابر کند، سئوی حرفهای سایت نیز میتواند ترافیک ارگانیک و فروش شما را بهطور چشمگیری افزایش دهد. این یک سرمایهگذاری با بازده بلندمدت است، نه هزینه! آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید.
📞 همین حالا برای مشاوره رایگان با ما تماس بگیرید:
09190994063 | 09376846692
بله، بایننس در ایران فیلتر است. برای استفاده از API بایننس در ایران، باید از یک VPN یا پروکسی معتبر استفاده کنید. در کد سی شارپ میتوانید با تنظیم Proxy در HttpClient این مشکل را حل کنید. البته اگه برنامه شما روی یک سرور خارج از ایران اجرا شود، نیازی به VPN ندارید.
Binance.Net ساخته JKorf بهترین و محبوبترین کتابخانه است که فعالانه نگهداری میشود. این کتابخانه هم REST API و هم WebSocket را پشتیبانی میکند، تایپسیف است و مستندات خوبی دارد. گزینه دوم استفاده مستقیم از HttpClient و پیادهسازی دستی است که انعطاف بیشتری میدهد اما زمان بیشتری میبرد.
بایننس محدودیت ۱۲۰۰ درخواست در دقیقه برای REST API دارد. برای مدیریت این محدودیت: از WebSocket بهجای Polling استفاده کنید، درخواستها را Batch کنید، و بین درخواستهای مکرر Delay اضافه کنید. کتابخانه Binance.Net بهصورت خودکار Rate Limit را مدیریت میکند.
بله! کتابخانه Binance.Net از بخشهای مختلف بایننس پشتیبانی میکند: SpotApi برای معاملات اسپات، UsdFuturesApi برای فیوچرز USDT-M و CoinFuturesApi برای فیوچرز Coin-M. هر بخش APIهای مخصوص خودش را دارد.
این خطا به دلیل اختلاف ساعت سیستم با سرور بایننس ایجاد میشود. راهحل: تنظیم recvWindow به مقدار بیشتر (مثلاً ۱۰۰۰۰ میلیثانیه) یا هماهنگسازی ساعت سیستم با NTP. در کتابخانه Binance.Net میتوانید با تنظیم options.TimestampRecalculationInterval این مشکل را حل کنید.
Binance Testnet از نظر ساختار API کاملاً شبیه محیط واقعی است، اما قیمتها ممکن است کمی متفاوت باشند. برای تست منطق برنامه عالی است. نکته مهم: Testnet یک API Key جداگانه میخواهد که از testnet.binance.vision باید دریافت کنید. از این محیط قبل از هر استقرار در محیط واقعی حتماً استفاده کنید.
توضیحات مربوط به Rate Limit و Retry Logic بسیار حرفهای بود. این مسائل در پروژههای واقعی اهمیت زیادی دارند. ممنون بابت به اشتراک گذاشتن این نکات ارزشمند.
مدیریت خطاها و محدودیتهای Rate Limit بخش جداییناپذیری از توسعه هر سیستمی است که با APIهای خارجی کار میکند. خوشحالیم که برایتان مفید بود. اگر سوالی دارید یا به مشاوره نیاز دارید: 09190994063 | 09376846692
مطالب امنیتی بسیار مهم و حیاتی بودند، مخصوصاً درباره ذخیره نکردن API Key در کد. آیا راهنمایی بیشتری برای دیپلوی کردن ربات روی VPS و مدیریت امن API Key در آن محیط دارید؟
نکات امنیتی از مهمترین بخشهای کار با API هستند. برای دیپلوی روی VPS، استفاده از Environment Variables (متغیرهای محیطی) به جای فایل کانفیگ توصیه میشود. همچنین فعالسازی IP Whitelist در بایننس را جدی بگیرید. برای جزئیات بیشتر با ما در تماس باشید: 09190994063 | 09376846692
قسمت مربوط به Testnet حیاتیترین بخش بود. حتما قبل از هر کاری روی تستنت امتحان میکنم. آیا امکان دریافت API Key تستنت از طریق خود API وجود دارد یا باید دستی از سایت بگیریم؟
بسیار خوب که به اهمیت Testnet توجه دارید. API Key تستنت باید بهصورت دستی از testnet.binance.vision دریافت شود و متفاوت از کلیدهای محیط واقعی است. برای راهنمایی در پروژههایتان با ما تماس بگیرید: 09190994063 | 09376846692
این مقاله بهترین منبع فارسی برای اتصال به API بایننس با سی شارپ است. واقعا از صفر تا صد همه چیز رو پوشش دادید. خیلی ممنون از تلاش شما.
از بازخورد مثبت شما سپاسگزاریم. هدف ما ارائه محتوای کاربردی و کامل برای جامعه توسعهدهندگان ایرانی است. برای پروژههای سئو و دیجیتال مارکتینگ نیز میتوانید با ما در تماس باشید: 09190994063 | 09376846692
استفاده از کتابخانه Binance.Net واقعاً کار رو راحت میکنه. قبلش فکر میکردم باید خودم امضا و هدرها رو مدیریت کنم. بخش WebSocket هم عالی بود برای دریافت قیمتهای لحظهای. دستتون درد نکنه.
بله، کتابخانه Binance.Net کار توسعهدهندگان را بسیار ساده میکند. انتخاب ابزار مناسب، سرعت و کیفیت پروژه را افزایش میدهد. برای دریافت مشاوره در خصوص پروژههای خود با ما تماس بگیرید: 09190994063 | 09376846692
خطای «Timestamp for this request is outside of the recvWindow» واقعاً آزاردهنده است. توضیحات شما برای رفع آن خیلی مفید بود. آیا خود کتابخانه Binance.Net قابلیت تنظیم خودکار ساعت را دارد؟
این خطا رایج است و دلیل آن اختلاف ساعت سیستم شما با سرور بایننس است. Binance.Net میتواند با تنظیم options.TimestampRecalculationInterval تا حدی آن را مدیریت کند. اطمینان از همگامسازی ساعت سیستم با NTP بهترین راهحل است. برای راهنمایی بیشتر تماس بگیرید: 09190994063 | 09376846692
مقاله بسیار جامع و کاربردی بود. ممنون از توضیحات قدم به قدمتون. در مورد نیاز به VPN برای اتصال از ایران، آیا راهی هست که بدون VPN به API وصل شد (مثلاً از طریق تنظیمات پروکسی در کد)؟
خوشحالیم که مقاله برایتان مفید بوده است. بله، در کد سی شارپ میتوانید تنظیمات پروکسی را برای HttpClient اعمال کنید تا درخواستها از طریق پروکسی ارسال شوند. برای مشاوره بیشتر میتوانید با ما تماس بگیرید: 09190994063 | 09376846692
ربات معاملاتی سادهای که معرفی کردید نقطه شروع خوبی برای علاقهمندان است. آیا میتوانیم این ربات را برای فیوچرز هم استفاده کنیم؟ تفاوتهای اصلی در کدنویسی فیوچرز چیست؟
بسیار عالی. بله، کتابخانه Binance.Net از فیوچرز هم پشتیبانی میکند. تفاوت اصلی در استفاده از کلاینتهای مربوط به فیوچرز (مثل UsdFuturesApi) و انواع سفارشات مخصوص فیوچرز است. برای توسعه پیشرفتهتر میتوانید با ما مشورت کنید: 09190994063 | 09376846692