C# 交易机器人开发指南:连接币安与获取价格数据

·

本指南将详细介绍如何使用 C# 构建一个基础交易机器人,实现与币安交易所的连接、获取实时价格数据,并利用技术指标分析市场趋势。

概述

在金融市场中,交易策略多种多样,涵盖股票、大宗商品、外汇和加密货币等不同资产类别。根据交易频率,可分为 scalp trading(高频交易)、day trading(日内交易)、swing trading(波段交易)和 position trading(头寸交易)。分析方法则主要包括技术分析与基本面分析。

本系列文章聚焦于基于技术分析的自动化加密货币日内交易。本文将指导您使用 C# 和币安交易所 API 构建一个基础市场监视机器人,后续文章将逐步添加通知系统和交易执行功能。

开发环境准备

基础要求

创建控制台应用

通过命令行创建新项目:

dotnet new console --name MarketWatcher
cd MarketWatcher

或者使用 Visual Studio:

  1. 打开 Visual Studio,选择“创建新项目”
  2. 在语言下拉列表中选择 C#,选择“控制台应用”模板
  3. 在配置窗口中输入项目名称“MarketWatcher”
  4. 保留默认设置,点击“创建”

连接币安交易所

安装必要库

我们使用专门的 API 库来简化与交易所的通信:

dotnet add package WhalesSecret.ScriptApiLib

建立连接

由于本文仅涉及市场数据获取,无需币安账户即可访问公开数据。在 Program.cs 中添加以下代码:

using WhalesSecret.ScriptApiLib;
using WhalesSecret.TradeScriptLib.API.TradingV1;
using WhalesSecret.TradeScriptLib.API.TradingV1.MarketData;
using WhalesSecret.TradeScriptLib.Entities;
using WhalesSecret.TradeScriptLib.Entities.MarketData;

await using ScriptApi scriptApi = await ScriptApi.CreateAsync();

Console.WriteLine("初始化币安交易所...");
// 初始化交易所资产和币种信息
await scriptApi.InitializeMarketAsync(ExchangeMarket.BinanceSpot);

Console.WriteLine("连接中...");
// 无需API凭证即可连接市场数据
ConnectionOptions options = new(ConnectionType.MarketData);
await using ITradeApiClient tradeClient = await scriptApi.ConnectAsync(ExchangeMarket.BinanceSpot, options);
Console.WriteLine("连接成功!");

此代码初始化与币安现货市场的连接,仅用于获取市场数据。

获取历史价格数据

理解市场价格数据

在交易中,“价格”通常指最后一笔交易的执行价格,而非订单簿中的买卖报价。订单簿包含所有当前的买入和卖出订单,而交易发生时订单会被匹配。

蜡烛图(Candlestick)是展示价格变动的有效方式,每个蜡烛代表特定时间段内的价格区间:

例如,2025年3月2日的BTC/USDT日线显示:

蜡烛图还包含交易量信息,即该时间段内的交易总量。

实现蜡烛图订阅与RSI计算

获取历史蜡烛数据

await using ICandlestickSubscription subscription = await tradeClient.CreateCandlestickSubscriptionAsync(SymbolPair.BTC_USDT);

// 获取过去3天的1分钟蜡烛数据
DateTime endTime = DateTime.Now;
DateTime startTime = endTime.AddDays(-3);

CandlestickData candlestickData = await tradeClient.GetCandlesticksAsync(SymbolPair.BTC_USDT, CandleWidth.Minute1, startTime, endTime);

计算相对强弱指数(RSI)

RSI是衡量市场超买超卖状态的重要技术指标。我们使用 Skender.Stock.Indicators 库进行计算:

dotnet add package Skender.Stock.Indicators
using Skender.Stock.Indicators;

// 将蜡烛数据转换为指标库需要的格式
List<Quote> quotes = new();
foreach (Candle candle in candlestickData.Candles)
    quotes.Add(QuoteFromCandle(candle));

// 获取最新闭合蜡烛
Candle lastClosedCandle = subscription.GetLatestClosedCandlestick(CandleWidth.Minute1);

Console.WriteLine($"最后闭合蜡烛: {lastClosedCandle}");
ReportRsi(quotes);

// 持续监听新蜡烛
while (true)
{
    Console.WriteLine("等待下一个闭合蜡烛...");
    
    try
    {
        lastClosedCandle = await subscription.WaitNextClosedCandlestickAsync(CandleWidth.Minute1);
    }
    catch (OperationCanceledException)
    {
        break;
    }

    Console.WriteLine($"新闭合蜡烛到达: {lastClosedCandle}");
    quotes.Add(QuoteFromCandle(lastClosedCandle));
    ReportRsi(quotes);
}

static void ReportRsi(IEnumerable<Quote> quotes)
{
    IEnumerable<RsiResult> results = quotes.GetRsi();
    RsiResult lastRsi = results.Last();
    
    string interpretation = lastRsi.Rsi switch
    {
        < 30 => " (超卖!)",
        > 70 => " (超买!)",
        _ => string.Empty
    };
    
    Console.WriteLine($"当前 RSI: {lastRsi.Date} -> {lastRsi.Rsi}{interpretation}");
}

static Quote QuoteFromCandle(Candle candle)
{
    return new Quote
    {
        Date = candle.Timestamp,
        Open = candle.OpenPrice,
        High = candle.HighPrice,
        Low = candle.LowPrice,
        Close = candle.ClosePrice,
        Volume = candle.BaseVolume
    };
}

输出示例

最后闭合蜡烛: [Timestamp=2025-03-15 09:36:00,OpenPrice=83821.35,HighPrice=83821.35,LowPrice=83811.74,ClosePrice=83811.74,BaseVolume=3.45983]
当前 RSI: 15.03.2025 9:36:00 -> 52.24

等待下一个闭合蜡烛...
新闭合蜡烛到达: [Timestamp=2025-03-15 09:37:00,OpenPrice=83811.75,HighPrice=83854.53,LowPrice=83811.74,ClosePrice=83851.98,BaseVolume=26.12462]
当前 RSI: 15.03.2025 9:37:00 -> 58.32

RSI值低于30表示市场可能超卖(买入机会),高于70表示可能超买(卖出机会)。👉 查看实时市场分析工具 获取更深入的市场洞察。

常见问题

是否需要币安账户才能使用市场数据?

不需要。币安的市场数据是公开的,只有下单、查询账户余额等操作才需要API密钥和账户。

RSI指标有哪些局限性?

RSI作为动量指标,在趋势市场中可能长时间处于超买或超卖状态,产生错误信号。建议结合其他指标和使用适当的时间框架。

如何处理API连接中断?

实现重连机制和错误处理是生产环境中的必要措施。建议添加指数退避算法和连接状态监控。

这个机器人可以直接用于实盘交易吗?

本文提供的代码仅用于教育目的,需要添加风险控制、资金管理和实盘测试后才能用于实际交易。

除了RSI,还有哪些常用技术指标?

常用指标包括移动平均线(MA)、MACD、布林带(Bollinger Bands)、随机振荡器(Stochastic Oscillator)等。每种指标都有其特定应用场景。

如何选择合适的时间框架?

时间框架选择取决于交易策略: scalp trading使用1-5分钟,day trading使用15分钟-1小时,swing trading使用4小时-日线。

总结

本文介绍了如何使用C#构建基础交易机器人,包括连接币安交易所、获取历史价格数据、订阅实时蜡烛图数据以及计算RSI指标。这些基础功能为后续添加交易执行和风险管理功能奠定了基础。

重要提示:本文内容仅供教育目的,不构成投资建议。加密货币交易具有高风险,请在充分了解风险并根据自身情况谨慎决策。