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

张开发
2026/4/8 10:48:29 15 分钟阅读

分享文章

期货软件开发 - C# 调用 HQChart 指标计算 C++ 动态库
C# 调用 HQChart 行情 / 指标计算 C 动态库hqchart.csharp.dll的互操作层代码负责定义 C/C# 互通的数据结构定义 DLL 回调你的数据加载接口导出 DLL调用方法提供上层业务通用模型一、命名空间 引用namespace HQChart.Interface作用HQChart 接口层所有与原生 DLL 交互的代码都放这里引用System.Runtime.InteropServicesC# 与 C 交互必备//# define __DEBUG__注释的 C 调试宏C# 不生效仅标记用二、核心数据结构体C ↔ C# 内存互通所有结构体都带[StructLayout(LayoutKind.Sequential, Pack 1)]→固定内存布局保证 C# 和 C 结构完全一致不崩溃、不乱码。1. K 线单条数据HQCHART_KDATApublic 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_INFOpublic 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_RESULTpublic 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_RESULTpublic 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# 调用 Cpublic 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. 数据接口IHQChartDatapublic interface IHQChartData { bool LoadKData(...); bool GetDataByNumber(...); IntPtr GetIndexScript(...); }你必须实现这个接口提供数据2. 结果回调IHQChartResultpublic 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六、最简使用流程一看就懂你实现IHQChartData提供 K 线 / 财务数据你实现IHQChartResult接收成功 / 失败结果构造RunConfig指标参数调用HQChartDll.Run()DLL 回调你拿数据 → 计算完成 → 回调你返回结果七、代码用途总结对接原生 DLL定义交互结构定义回调规则提供调用入口封装业务模型

更多文章