期货软件开发 - C# 调用 HQChart 指标计算 C++ 动态库

C# 调用 HQChart 行情 / 指标计算 C++ 动态库(hqchart.csharp.dll)的互操作层代码,负责:

  • 定义 C++/C# 互通的数据结构
  • 定义 DLL 回调你的数据加载接口
  • 导出 DLL 调用方法
  • 提供上层业务通用模型

一、命名空间 & 引用

复制代码
namespace HQChart.Interface
  • 作用:HQChart 接口层,所有与原生 DLL 交互的代码都放这里

  • 引用:System.Runtime.InteropServices C# 与 C++ 交互必备

    //# define DEBUG

  • 注释的 C++ 调试宏,C# 不生效,仅标记用


二、核心数据结构体(C++ ↔ C# 内存互通)

所有结构体都带:[StructLayout(LayoutKind.Sequential, Pack = 1)]固定内存布局,保证 C# 和 C++ 结构完全一致,不崩溃、不乱码。

1. K 线单条数据 HQCHART_KDATA

复制代码
public struct HQCHART_KDATA
{
    public int _nDate;       // 日期 如:20250407
    public int _nTime;       // 时间 如:093000
    public double _dYClose;  // 昨收
    public double _dOpen;    // 开盘
    public double _dHigh;    // 最高
    public double _dLow;     // 最低
    public double _dClose;   // 收盘
    public double _dVol;     // 成交量
    public double _dAmount;  // 成交额
    public int _nAdvance;    // 上涨家数
    public int _nDecline;    // 下跌家数
    public double _dPosition;// 持仓
    public double _dSettle;  // 结算价
    public string _exData;  // 扩展字段
}
  • 作用:一条 K 线数据
  • 给 DLL 提供行情数据

2. K 线查询信息 HQCHART_KDATA_INFO

复制代码
public struct HQCHART_KDATA_INFO
{
    public int _lPeriod;     // 周期 日线/分钟线
    public int _lRight;      // 复权
    public int _lStartDate;  // 开始日期
    public int _lStartTime;
    public int _lEndDate;    // 结束日期
    public int _lEndTime;
    public int _lCount;      // 数据条数
}
  • 作用:DLL 问你要数据时,告诉你要什么周期、什么时间范围

3. K 线返回结果 HQCHART_KDATA_RESULT

复制代码
public struct HQCHART_KDATA_RESULT
{
    public IntPtr _pData;    // K线数据指针(C++数组)
    public int _lCount;      // 数据数量
    public IntPtr _pszName;  // 股票名称
    public bool _bResult;   // 是否成功
    public IntPtr _pszError; // 错误信息
    public int _lPeriod;     // 周期
    public int _lRight;      // 复权
}
  • 作用:你返回给 DLL 的 K 线数据
  • IntPtr = C++ 内存指针

4. 指标单值结果 HQCHART_VALUE_RESULT

复制代码
public struct HQCHART_VALUE_RESULT
{
    public double _dValue;   // 指标值
    public IntPtr _pData;    // 数据数组
    public int _lCount;      // 数量
    public bool _bResult;    // 成功
    public IntPtr _szError;  // 错误
}
  • 作用:返回 MA/MACD/KDJ/CAPITAL/FINANCE 等指标 / 财务数据

5. 函数参数结构体(多参数指标用)

复制代码
public struct FUNCTION_ARG_ITEM
public struct CUSTOM_FUNCTION_ARGUMENT
  • 作用:支持 FINONE(...)、GPJYVALUE(...) 多参数函数
  • 最多 20 个参数

三、回调委托(DLL 主动调用 C#)

这是 整个接口的灵魂 :DLL 计算指标时,缺数据就会回调你,你必须提供数据。

1. 加载 K 线

复制代码
delegate bool pHQChart_LoadKData(股票代码, 周期, 复权, ref 结果集)
delegate bool pHQChart_LoadKData2(...)
  • DLL 问你要:某股票、某周期 K 线

2. 读取财务 / 动态数据

复制代码
delegate bool pHQChart_GetDataByNumber(...) // FINANCE(1)
delegate bool pHQChart_GetDataByNumbers(...) // FINONE(...)
delegate bool pHQChart_GetDataByName(...)    // CAPITAL/TOTALCAPITAL
  • 财务数据、流通盘、总股本、行情函数......

3. 读取系统指标脚本

复制代码
delegate IntPtr pHQChart_GetIndexScript(...)
  • 提供 MA、MACD、KDJ 等指标脚本

4. 计算结果回调

复制代码
delegate void pHQChart_Success(...)  // 指标计算成功
delegate void pHQChart_Failed(...)   // 失败

5. 回调函数集合

复制代码
public struct HQCHART_CALLBACK_PTR
{
    public pHQChart_LoadKData _pLoadKData;
    public pHQChart_LoadKData2 _pLoadKData2;
    public pHQChart_GetDataByNumber _pGetDataByNumber;
    ...
    所有回调都在这里
}
  • 把所有回调打包传给 DLL

四、DLL 导出函数(C# 调用 C++)

复制代码
public class HQChartDll
{
    [DllImport("hqchart.csharp.dll")]
    public static extern bool Run(string jsonConfig, HQCHART_CALLBACK_PTR callback);

    [DllImport(...)] public static extern int MainVersion();
    [DllImport(...)] public static extern int MinVersion();
    [DllImport(...)] public static extern IntPtr GetAuthorizeInfo();
}

核心函数:Run()

  • 作用:执行指标脚本计算
  • 参数:
    • JSON 配置(股票、脚本、周期、参数)
    • 回调集合
  • 返回:是否启动成功

五、上层业务接口(给你写业务用)

1. 数据接口 IHQChartData

复制代码
public interface IHQChartData
{
    bool LoadKData(...);
    bool GetDataByNumber(...);
    IntPtr GetIndexScript(...);
}
  • 必须实现这个接口,提供数据

2. 结果回调 IHQChartResult

复制代码
public interface IHQChartResult
{
    void pHQChart_Success(...);
    void pHQChart_Failed(...);
}

3. 运行配置模型

复制代码
public class RunConfig
{
    public string Script { get; set; }   // 指标脚本
    public int Period { get; set; }      // 周期
    public int Right { get; set; }       // 复权
    public string Symbol { get; set; }   // 股票代码
}
  • 直接用来构建 Run () 函数需要的 JSON

六、最简使用流程(一看就懂)

  1. 你实现 IHQChartData 提供 K 线 / 财务数据
  2. 你实现 IHQChartResult 接收成功 / 失败结果
  3. 构造 RunConfig 指标参数
  4. 调用 HQChartDll.Run()
  5. DLL 回调你拿数据 → 计算完成 → 回调你返回结果

七、代码用途总结

  • 对接原生 DLL
  • 定义交互结构
  • 定义回调规则
  • 提供调用入口
  • 封装业务模型
相关推荐
不想写代码的星星2 小时前
C++ 内存管理:分区、自定义分配器、常见问题与检测工具
c++
-许平安-3 小时前
MCP项目笔记九(插件 bacio-quote)
c++·笔记·ai·plugin·mcp
沉鱼.443 小时前
第十三届题目
c语言·c++·算法
liulilittle3 小时前
C++ 无锁编程:单停多发送场景高性能方案
服务器·开发语言·c++·高性能·无锁·原子
武藤一雄3 小时前
C# 异常(Exception)处理避坑指南
windows·microsoft·c#·.net·.netcore·鲁棒性
无限进步_4 小时前
【C++】巧用静态变量与构造函数:一种非常规的求和实现
开发语言·c++·git·算法·leetcode·github·visual studio
小超超爱学习99374 小时前
大数乘法,超级简单模板
开发语言·c++·算法
xyx-3v5 小时前
qt创建新工程
开发语言·c++·qt
样例过了就是过了5 小时前
LeetCode热题100 爬楼梯
c++·算法·leetcode·动态规划