如何使用 C# .NET CORE 2.0 将 FIX 登录消息发送到 GDAX

2023-12-19

我正在尝试建立一个到 fix.gdax.com 的 FIX 4.2 会话(文档:https://docs.gdax.com/#fix-api https://docs.gdax.com/#fix-api)使用 C# 和 .Net Core 2.0。当我尝试登录时,我收到 0 字节作为服务器响应。我真的不知道我错了什么,这是代码:

    private async Task ConnectToGdaxFix()
    {
        _socketTcpClient = new TcpClient();
        _socketTcpClient.NoDelay = true;
        _bufferEnd = 0;
        await _socketTcpClient.ConnectAsync(_gdaxFixGateway, _gdaxFixPort);
        _sslStream = new SslStream(_socketTcpClient.GetStream());
        await _sslStream.AuthenticateAsClientAsync(_gdaxFixGateway);
        byte[] buffer = new byte[2048];
        var message = await FixSendLoginMessage();
        var bytes = await _sslStream.ReadAsync(buffer, 0, buffer.Length);
    }

    private async Task<string> FixSendLoginMessage()
    {
        var sendTime = DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss.fff");
        string msgType = "A";
        var messageSeqNumber = (++messageSeqNum).ToString();
        var senderCompId = "apiKey";
        var targetCompId = "Coinbase";
        var password = "passphrase";
        var accessSign = CreateAccessSign(
                sendTime,
                msgType,
                messageSeqNumber,
                senderCompId,
                targetCompId,
                password
            );
        var logonMessage = $"98=0{'\x01'}108=30{'\x01'}554={password}{'\x01'}96={accessSign}{'\x01'}8013=Y";
        var headerAfter9Tag = $"35={msgType}{'\x01'}34={messageSeqNumber}{'\x01'}52={sendTime}{'\x01'}49={senderCompId}{'\x01'}56={targetCompId}";
        var length = logonMessage.Length + headerAfter9Tag.Length + 1;
        var messageHeader = $"8=FIX.4.2{'\x01'}9={length}{'\x01'}{headerAfter9Tag}";
        var messageWithHeader = $"{messageHeader}{'\x01'}{logonMessage}{'\x01'}";
        int sum = 0;
        int len = messageWithHeader.Length;
        for (int i = 0; i < len; i++)
        {
            sum += Convert.ToChar(messageWithHeader.Substring(i, 1));
        }
        sum = sum % 256;
        var messageWithChecksum = $"{messageWithHeader}10={sum.ToString("000")}{'\x01'}";
        byte[] buffer = Encoding.ASCII.GetBytes(messageWithChecksum);
        await _sslStream.WriteAsync(buffer, 0, buffer.Length);
        await _sslStream.FlushAsync();
        return messageWithChecksum;
    }

    private string CreateAccessSign(
            string sendingTime,
            string msgType,
            string msgSeqNumber,
            string senderCompId,
            string targetCompId,
            string password
        )
    {
        var stringToHash = string.Join('\x01', sendingTime, msgType, msgSeqNumber, senderCompId, targetCompId, password);
        var privateKeyAsBytes = Encoding.UTF8.GetBytes("privateKey");
        using (var hmac = new HMACSHA256(privateKeyAsBytes))
        {
            var signature = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToHash));
            return Convert.ToBase64String(signature);
        }
    }

谁能帮我看看登录消息或 ssl 加密有什么问题吗?

这是发送到Gdax的消息(敏感数据的字符已被替换,\x01是|以简化视图):8=FIX.4.2|9=161|35=A|34=1|52= 20180124-00:50:34.083|49=426123d789fa8e5c3782c549kj9de06e|56=Coinbase|98=0|108=30|554=outwrt|96=qkE5KPMLjn+Ef9Zgk1/kvL0Etem6bK2llINwMjOk Dy9=|8013=Y|10=028


CreateAccessSign是错误的,privateKeyAsBytes需要使用Convert.FromBase64String:

    var privateKeyAsBytes = Convert.FromBase64String("privateKey");

FixSendLoginMessage 是错误的,这是正确的实现:

    private async Task<string> FixSendLoginMessage()
{
    var sendTime = DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss.fff");
    string msgType = "A";
    var messageSeqNumber = (++messageSeqNum).ToString();
    var senderCompId = "apiKey";
    var targetCompId = "Coinbase";
    var password = "passphrase";
    var accessSign = CreateAccessSign(
            sendTime,
            msgType,
            messageSeqNumber,
            senderCompId,
            targetCompId,
            password
        );
    var logonMessage = $"98=0{'\x01'}108=30{'\x01'}554={password}{'\x01'}96={accessSign}{'\x01'}8013=Y{'\x01'}";
    var headerAfter9Tag = $"35={msgType}{'\x01'}34={messageSeqNumber}{'\x01'}52={sendTime}{'\x01'}49={senderCompId}{'\x01'}56={targetCompId}{'\x01'}";
    var length = logonMessage.Length + headerAfter9Tag.Length;
    var messageHeader = $"8=FIX.4.2{'\x01'}9={length}{'\x01'}{headerAfter9Tag}";
    var messageWithHeader = $"{messageHeader}{logonMessage}";
    int sum = 0;
    int len = messageWithHeader.Length;
    for (int i = 0; i < len; i++)
    {
        sum += Convert.ToChar(messageWithHeader.Substring(i, 1));
    }
    sum = sum % 256;
    var messageWithChecksum = $"{messageWithHeader}10={sum.ToString("000")}{'\x01'}";
    byte[] buffer = Encoding.ASCII.GetBytes(messageWithChecksum);
    await _sslStream.WriteAsync(buffer, 0, buffer.Length);
    await _sslStream.FlushAsync();
    return messageWithChecksum;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C# .NET CORE 2.0 将 FIX 登录消息发送到 GDAX 的相关文章

随机推荐

  • PySpark:saveAsNewAPIHadoopDataset() 可以用作批量加载到 HBase 吗?

    目前 我们使用 saveAsNewAPIHadoopDataset 通过 Spark RDD pyspark 将数据导入到 HBase 表中 该函数是否通过mapreduce使用HBase批量加载功能 换句话说 直接导入HBase的save
  • C# 文本框中的链接

    我有一个自定义 Jabber IM 客户端 但我遇到链接问题 当类似的事情http something com http something com输入后我希望它在消息窗口中显示为链接 消息窗口是一个标准的 C 文本框 有没有办法将其标记为
  • R:从开头开始找到最大公共子串

    我有 2 个向量 word1 lt bestelling word2 lt bestelbon 现在我想找到从头开始的最大公共子串 所以这里是 bestel 但以另外两个词为例 bestelling 和 stel 那么我想返回 Matthe
  • Egit 克隆不起作用

    我可以从命令行克隆 但不能通过 Egit Eclipse 克隆 广泛的谷歌搜索没有给出答案 这个问题之前已经被问过很多次了 我几乎尝试了所有建议的东西 我不断收到 无法打开 git upload pack 的消息 是的 我可以从命令行克隆然
  • 无法使用 SQL Server Management Studio 连接到 SQL Azure

    我已在 Azure 门户上创建了一个 SQL Azure 数据库 现在我想使用 SQL Server Management Studio 连接到它 我已经这样设置我的属性 Server Type Database Engine Server
  • 弹出窗口的箭头用于跟踪滚动视图中的对象

    每当触摸表格视图中的单元格时 我都会显示一个弹出窗口 箭头指向该单元格 并且始终指向左侧或右侧 而不是向上或向下 表视图设置为弹出窗口的passthroughView 以便用户可以在弹出窗口仍然打开时选择不同的单元格 从而为所选单元格生成一
  • 从 igraph 到 ggplot 对象

    我使用 ggraph 和 igraph 构建了树状图 library ggraph library igraph EL lt read csv EL2 csv sep header TRUE stringsAsFactors FALSE E
  • 从动态 json 数据更新力导向图上的链接

    我是 D3 的新手 正在研究力定向图 其中 json 数据是动态的 我能够在收到新数据后更改力图 但这会产生弹跳效应 创建我的力图的代码是 div class graph div
  • MySQL 与 InnoDB 的死锁问题

    我有一个中央数据库服务器和几个 工作 服务器 它们同时执行这样的查询 UPDATE job queue SET worker 108 166 81 112 attempts attempts 1 started 2014 01 14 10
  • PySimpleGui 右对齐框架中的按钮

    我正在构建一个简单的 GUIpysimplegui并想要右对齐框架内的按钮 我找到了有关如何使用文本而不是按钮执行此操作的详细信息 例如 我希望下面的按钮能够卡入框架的右侧 周围有凹槽 我要这个 看起来更像这样 但无需添加手动调整的空白文本
  • 如何检查鼠标是否位于控件上

    如何检查鼠标是否位于某一 HWND 上方 我尝试过使用 WM MOUSELEAVE 和 WM MOUSEMOVE 消息来跟踪 但是如果您单击按钮并将鼠标拖出按钮 则在释放鼠标之前它不会收到 WM MOUSELEAVE 这为时已晚 因为 当您
  • 如何通过 log4net 记录机器名称?

    我使用 Log4Net 和 AdoNetAppender 将消息从简单的系统托盘应用程序记录到 SQL Server 2005 数据库中 我想将计算机名称与日志消息一起记录 因为该应用程序将在多台计算机上运行 并且我需要知道消息源自哪一台计
  • asp.net MVC3 部分视图结果不更新 EditorFor 值

    我有一个简单的电子邮件捕获表单作为我的主页的一部分 但是当我返回部分视图时 表单编辑器的模型值没有更新 该模型 public class Contact Key public int Id get set Required public s
  • 在每个 PHP 回溯级别获取范围内的变量?

    有没有办法在回溯中查看每个堆栈帧中设置的变量 我可以通过组合来非常接近debug backtrace true 来获取对象 get object vars在每个对象上获取 this vars args每个回溯帧中的键 以及get defin
  • 为什么FocusNode需要在flutter中进行处置?

    我有点很困惑何时使用dispose扑腾中 有关于这方面的好的教程吗 在食谱中https flutter io docs cookbook forms focus https flutter io docs cookbook forms fo
  • 在 Android 中将视频流传输到网络

    我想制作一个可以将视频流传输到网络的 Android 应用程序 我知道如何在 Android 中录制视频 但不知道如何将其流式传输到网络 我不想将此视频存储到手机的 SD 卡上 但我希望将其存储在网络上 为此 我计划使用 ASP NET W
  • AWS ECS:运行任务失败原因:[“ATTRIBUTE”]

    当尝试在 EC2 实例中运行任务时 我收到了这条可怕的错误消息 Run tasks failed Reasons ATTRIBUTE 和其他许多人一样 https stackoverflow com questions 45173637 u
  • 如何防止在未插入行时触发插入触发器?

    我有一个表1 在此表上我创建了一个触发器 插入或更新或删除之后 现在 如果我执行一个不插入任何内容的插入 触发器仍然会被触发 insert into TABLE1 select from TABLE1 where 1 0 该查询不会插入任何
  • IObservable 按下的按键

    所以我可以尝试反应式扩展 我想创建一个用户按下的按键的 IObservable 我怎样才能做到这一点 这是一个 C 控制台应用程序 尝试这样做来获取可观察的读取键序列 IObservable
  • 如何使用 C# .NET CORE 2.0 将 FIX 登录消息发送到 GDAX

    我正在尝试建立一个到 fix gdax com 的 FIX 4 2 会话 文档 https docs gdax com fix api https docs gdax com fix api 使用 C 和 Net Core 2 0 当我尝试