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_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
六、最简使用流程(一看就懂)
- 你实现
IHQChartData提供 K 线 / 财务数据 - 你实现
IHQChartResult接收成功 / 失败结果 - 构造
RunConfig指标参数 - 调用
HQChartDll.Run() - DLL 回调你拿数据 → 计算完成 → 回调你返回结果
七、代码用途总结
- 对接原生 DLL
- 定义交互结构
- 定义回调规则
- 提供调用入口
- 封装业务模型