C#接收股票数据问题,请高手指教

Discussion in 'General Topics on Software and Data' started by junxian_chen, Jan 18, 2008.

  1. 股票数据接收时的问题:
    C++结构:
    typedef struct tagRCV_DATA
    {
    int m_wDataType; // 文件类型
    int m_nPacketNum; // 记录数,参见注一
    RCV_FILE_HEADEx m_File; // 文件接口
    BOOL m_bDISK; // 文件是否已存盘的文件
    union
    {
    RCV_REPORT_STRUCTEx * m_pReport;
    RCV_REPORT_STRUCTEx1 * m_pReport1;
    RCV_REPORT_STRUCTEx2 * m_pReport2;
    RCV_HISTORY_STRUCTEx * m_pDay;
    RCV_MINUTE_STRUCTEx * m_pMinute;
    RCV_POWER_STRUCTEx *m_pPower;
    void *m_pData; // 参见注二
    };
    } RCV_DATA,*PRCV_DATA;


    typedef struct tagRCV_REPORT_STRUCTEx
    {
    WORD m_cbSize; // 结构大小
    time_t m_time; // 交易时间
    WORD m_wMarket; // 股票市场类型
    char m_szLabel[STKLABEL_LEN]; // 股票代码,以'\0'结尾
    char m_szName[STKNAME_LEN-15]; // 股票名称,以'\0'结尾
    BYTE m_Dec:4;
    BYTE m_Enabled:1;
    BYTE m_VolFlag:1;
    BYTE m_Other:2;
    WORD m_ID;
    float m_fOpenInterest;
    float m_fLastOpenInterest;
    float m_fLastSettle;

    float m_fLastClose; // 昨收
    float m_fOpen; // 今开
    float m_fHigh; // 最高
    float m_fLow; // 最低
    float m_fNewPrice; // 最新
    float m_fVolume; // 成交量
    float m_fAmount; // 成交额

    float m_fBuyPrice[3]; // 申买价1,2,3
    float m_fBuyVolume[3]; // 申买量1,2,3
    float m_fSellPrice[3]; // 申卖价1,2,3
    float m_fSellVolume[3]; // 申卖量1,2,3

    float m_fBuyPrice4; // 申买价4
    float m_fBuyVolume4; // 申买量4
    float m_fSellPrice4; // 申卖价4
    float m_fSellVolume4; // 申卖量4

    float m_fBuyPrice5; // 申买价5
    float m_fBuyVolume5; // 申买量5
    float m_fSellPrice5; // 申卖价5
    float m_fSellVolume5; // 申卖量5
    char m_szName2[48];
    __int64 m_IName;
    } RCV_REPORT_STRUCTEx, *PRCV_REPORT_STRUCTEx;


    对应的C#的结构:

    [StructLayout(LayoutKind.Sequential)]
    public struct RCV_DATA
    {
    //[FieldOffset(0)]
    public int m_wDataType; // 文件类型
    //[FieldOffset(4)]
    public int m_nPacketNum; // 记录数,参见注一
    //[FieldOffset(8)]
    public RCV_FILE_HEADEx m_File; // 文件接口
    //[FieldOffset(8)]
    //[MarshalAs(UnmanagedType.I4)]
    public int m_bDISK; // 文件是否已存盘的文件

    public IntPtr ptr;

    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_REPORT_STRUCTEx[] m_pReport;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_REPORT_STRUCTEx1[] m_pReport1;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_REPORT_STRUCTEx2[] m_pReport2;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_HISTORY_STRUCTEx[] m_pDay;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_MINUTE_STRUCTEx[] m_pMinute;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_POWER_STRUCTEx[] m_pPower;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.AsAny)]
    //public object m_pData; // 参见注二
    }

    enum BYTE : byte
    {
    m_Dec = 4,
    m_Enabled = 1,
    m_VolFlag = 1,
    m_Other = 2
    }


    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
    public struct RCV_REPORT_STRUCTEx
    {
    public ushort m_cbSize; // 结构大小
    public uint m_time; // 交易时间
    public ushort m_wMarket; // 股票市场类型

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码,以'\0'结尾
    [FieldOffset(18)]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)]
    public string m_szName; // 股票名称,以'\0'结尾

    BYTE BYTE;

    //BYTE m_Dec:4;
    //BYTE m_Enabled:1;
    //BYTE m_VolFlag:1;
    //BYTE m_Other:2;

    public ushort m_ID;
    public Single m_fOpenInterest;
    public Single m_fLastOpenInterest;
    public Single m_fLastSettle;

    public Single m_fLastClose; // 昨收
    public Single m_fOpen; // 今开
    public Single m_fHigh; // 最高
    public Single m_fLow; // 最低
    public Single m_fNewPrice; // 最新
    public Single m_fVolume; // 成交量
    public Single m_fAmount; // 成交额

    public Single m_fBuyPrice1; // 申买价1
    public Single m_fBuyPrice2; // 申买价2
    public Single m_fBuyPrice3; // 申买价3

    public Single m_fBuyVolume1; // 申买量1
    public Single m_fBuyVolume2; // 申买量2
    public Single m_fBuyVolume3; // 申买量3

    public Single m_fSellPrice1; // 申卖价1
    public Single m_fSellPrice2; // 申卖价2
    public Single m_fSellPrice3; // 申卖价3

    public Single m_fSellVolume1; // 申卖量1
    public Single m_fSellVolume2; // 申卖量2
    public Single m_fSellVolume3; // 申卖量3

    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fBuyPrice; // 申买价1,2,3
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fBuyVolume; // 申买量1,2,3
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fSellPrice; // 申卖价1,2,3
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fSellVolume; // 申卖量1,2,3

    public Single m_fBuyPrice4; // 申买价4
    public Single m_fBuyVolume4; // 申买量4
    public Single m_fSellPrice4; // 申卖价4
    public Single m_fSellVolume4; // 申卖量4

    public Single m_fBuyPrice5; // 申买价5
    public Single m_fBuyVolume5; // 申买量5
    public Single m_fSellPrice5; // 申卖价5
    public Single m_fSellVolume5; // 申卖量5
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)]
    public string m_szName2;
    public long m_IName;
    }


    public class StockDataDriver : System.Windows.Forms.Form
    {
    private const int RCV_WORK_SENDMSG = 4; // 版本 2 建议使用的方式
    // 其他工作方式保留

    // 消息类型
    private const int RCV_REPORT = 0x3f001234;
    private const int RCV_FILEDATA = 0x3f001235;


    //==================================== 数据结构 =================================================
    // 证券市场
    private const ushort SH_MARKET_EX = 18515; //"HS"; // 上海
    private const string SZ_MARKET_EX = "ZS"; // 深圳
    private const string HK_MARKET_EX = "KH"; // 香港

    // 文件数据类型
    // 结构数组形式的文件数据
    private const int FILE_HISTORY_EX = 2; // 补日线数据
    private const int FILE_MINUTE_EX = 4; // 补分钟线数据
    private const int FILE_POWER_EX = 6; // 补充除权数据
    private const int FILE_MIN5_EX = 81; // 补5分钟数据
    private const int FILE_MIN1_EX = 82; // 补1分钟数据

    private const int FILE_BASE_EX = 0x1000; // 钱龙兼容基本资料文件,m_szFileName仅包含文件名
    private const int FILE_NEWS_EX = 0x1002; // 新闻类,其类型由m_szFileName中子目录名来定
    private const int FILE_HTML_EX = 0x1004; // HTML文件,m_szFileName为URL

    private const int FILE_SOFTWARE_EX= 0x2000; // 升级软件

    private const int FILE_SHAZQDATA_EX= 0x3000; // 上海债券净价交易

    private const int FILE_TYPE_RES = -1; // 保留

    // 消息子类型
    private const int News_Sha_Ex = 2; // 上证消息
    private const int News_Szn_Ex = 4; // 深证消息
    private const int News_Fin_Ex = 6; // 财经报道
    private const int News_TVSta_Ex = 8; // 电视台通知
    private const int News_Unknown_Ex = -1; // 未知提供者

    //Definition For nInfo of Function GetStockDrvInfo(int nInfo,void * pBuf);
    private const int RI_IDSTRING = 1; // 厂商名称,返回(LPCSTR)厂商名
    private const int RI_IDCODE = 2; // 卡号
    private const int RI_VERSION = 3; // 驱动程序版本
    private const int RI_ERRRATE = 4; // 取信道误码
    private const int RI_STKNUM = 5; // 取上市股票总家数
    private const int RI_SUPPORTEXTHQ = 6; // 是否支持JSJ格式
    private const int RI_ENABLEDZHTRANS = 7; // 支持传输大智慧文件系统
    private const int RI_ENABLETS3FILE = 8; // 支持文件传输

    private const int RI_HASASKDATA = 0x1000; //双向支持,待定
    private const int RI_HIGHSPEED = 0x1002; //如果分析软件处理数据足够快,可以要求系统高速初始化代码
    //一般不能调用。目前只有倚天2000服务器和网络版使用
    private const int RI_SUPPORT_FUTURES = 0x1003;
    private const int RI_USERNAME = 0x1004; // 登陆用户
    private const int RI_PASSWORD = 0x1005; // 登密码
    private const int RI_IP = 0x1006; // 登陆用户
    private const int RI_SUPPORT_ID = 0x1007;
    private const int RI_HIDE = 0x1008; // 登陆时候隐藏界面
    private const int RI_SLEEP = 0x1009; // 登密码
    private const int RI_ASKDATA = 0x1010; // 登密码

    //软件完全按照倚天规范开发,调用本函数后,如果产品是期货
    //tagRCV_REPORT_STRUCTEx结构中
    //m_fAmount为成交金额,
    //m_fOpenInterest为持仓量
    //m_fLastOpenInterest为昨日持仓量
    //m_fLastSettle为昨结算,请不要使用这个变量,可能发生改变
    //m_fLastSettle为当日结算(如果有)请不要使用这个变量,可能发生改变
    //否则为持仓量
    //不调用则m_fAmount为持仓量,上述几个字段为无效
    private const int STKLABEL_LEN = 10; // 股号数据长度,国内市场股号编码兼容钱龙
    private const int STKNAME_LEN = 32; // 股名长度
    private const int STKLABEL_LEN_SKY = 48;

    //消息
    private const int My_Msg_StkData = 0x8000 + 1;


    //软件完全按照倚天规范开发,调用本函数后,如果产品是期货
    //tagRCV_REPORT_STRUCTEx结构中
    //m_fAmount为成交金额,
    //m_fOpenInterest为持仓量
    //m_fLastOpenInterest为昨日持仓量
    //m_fLastSettle为昨结算,请不要使用这个变量,可能发生改变
    //m_fLastSettle为当日结算(如果有)请不要使用这个变量,可能发生改变
    //否则为持仓量
    //不调用则m_fAmount为持仓量,上述几个字段为无效


    //国债净价交易数据
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct GzLxBINData
    {
    public ushort m_wMarket; // 股票市场类型
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码,以'\0'结尾
    public ushort m_LiXiDate; //开始计算利息的日期
    public double m_fMoney100; //每100元的利息
    public ushort m_DayNum; //利息计算天数
    public Single m_fShowPrice; //票面价格
    }

    [Flags]
    enum BYTE : byte
    {
    m_Dec = 4,
    m_Enabled = 1,
    m_VolFlag = 1,
    m_Other = 2
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct RCV_REPORT_STRUCTEx1
    {
    public ushort m_wMarket; // 股票市场类型
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码,以'\0'结尾
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)]
    public string m_szName; // 股票名称,以'\0'结尾
    BYTE BYTE;
    //BYTE m_Dec:4;
    //BYTE m_Enabled:1;
    //BYTE m_VolFlag:1;
    //BYTE m_Other:2;
    public ushort m_ID;
    public Single m_fOpenInterest;
    public Single m_fLastOpenInterest;
    public Single m_fLastSettle;

    public Single m_fLastClose; // 昨收
    public Single m_fOpen; // 今开
    public Single m_fHigh; // 最高
    public Single m_fLow; // 最低
    public Single m_fNewPrice; // 最新
    public Single m_fVolume; // 成交量
    public Single m_fAmount; // 成交额

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fBuyPrice; // 申买价1,2,3
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fBuyVolume; // 申买量1,2,3
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fSellPrice; // 申卖价1,2,3
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fSellVolume; // 申卖量1,2,3
    }

    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
    public struct RCV_REPORT_STRUCTEx
    {
    public ushort m_cbSize; // 结构大小
    public uint m_time; // 交易时间
    public ushort m_wMarket; // 股票市场类型

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码,以'\0'结尾
    [FieldOffset(18)]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)]
    public string m_szName; // 股票名称,以'\0'结尾

    BYTE BYTE;

    //BYTE m_Dec:4;
    //BYTE m_Enabled:1;
    //BYTE m_VolFlag:1;
    //BYTE m_Other:2;

    public ushort m_ID;
    public Single m_fOpenInterest;
    public Single m_fLastOpenInterest;
    public Single m_fLastSettle;

    public Single m_fLastClose; // 昨收
    public Single m_fOpen; // 今开
    public Single m_fHigh; // 最高
    public Single m_fLow; // 最低
    public Single m_fNewPrice; // 最新
    public Single m_fVolume; // 成交量
    public Single m_fAmount; // 成交额

    public Single m_fBuyPrice1; // 申买价1
    public Single m_fBuyPrice2; // 申买价2
    public Single m_fBuyPrice3; // 申买价3

    public Single m_fBuyVolume1; // 申买量1
    public Single m_fBuyVolume2; // 申买量2
    public Single m_fBuyVolume3; // 申买量3

    public Single m_fSellPrice1; // 申卖价1
    public Single m_fSellPrice2; // 申卖价2
    public Single m_fSellPrice3; // 申卖价3

    public Single m_fSellVolume1; // 申卖量1
    public Single m_fSellVolume2; // 申卖量2
    public Single m_fSellVolume3; // 申卖量3

    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fBuyPrice; // 申买价1,2,3
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fBuyVolume; // 申买量1,2,3
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fSellPrice; // 申卖价1,2,3
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    //public Single[] m_fSellVolume; // 申卖量1,2,3

    public Single m_fBuyPrice4; // 申买价4
    public Single m_fBuyVolume4; // 申买量4
    public Single m_fSellPrice4; // 申卖价4
    public Single m_fSellVolume4; // 申卖量4

    public Single m_fBuyPrice5; // 申买价5
    public Single m_fBuyVolume5; // 申买量5
    public Single m_fSellPrice5; // 申卖价5
    public Single m_fSellVolume5; // 申卖量5
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)]
    public string m_szName2;
    public long m_IName;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct RCV_REPORT_STRUCTEx2
    {
    public ushort m_cbSize; // 结构大小
    public ulong m_time; // 交易时间
    public ushort m_wMarket; // 股票市场类型
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码,以'\0'结尾
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKNAME_LEN - 15)]
    public string m_szName; // 股票名称,以'\0'结尾
    BYTE BYTE;

    //BYTE m_Dec:4;
    //BYTE m_Enabled:1;
    //BYTE m_VolFlag:1;
    //BYTE m_Other:2;
    public ushort m_ID;
    public Single m_fOpenInterest;
    public Single m_fLastOpenInterest;
    public Single m_fLastSettle;

    public Single m_fLastClose; // 昨收
    public Single m_fOpen; // 今开
    public Single m_fHigh; // 最高
    public Single m_fLow; // 最低
    public Single m_fNewPrice; // 最新
    public Single m_fVolume; // 成交量
    public Single m_fAmount; // 成交额

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fBuyPrice; // 申买价1,2,3
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fBuyVolume; // 申买量1,2,3
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fSellPrice; // 申卖价1,2,3
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public Single[] m_fSellVolume; // 申卖量1,2,3

    public Single m_fBuyPrice4; // 申买价4
    public Single m_fBuyVolume4; // 申买量4
    public Single m_fSellPrice4; // 申卖价4
    public Single m_fSellVolume4; // 申卖量4

    public Single m_fBuyPrice5; // 申买价5
    public Single m_fBuyVolume5; // 申买量5
    public Single m_fSellPrice5; // 申卖价5
    public Single m_fSellVolume5; // 申卖量5
    }

    //补充数据头
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct RCV_EKE_HEADEx
    {
    public uint m_dwHeadTag; // = EKE_HEAD_TAG
    public ushort m_wMarket; // 市场类型
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class AskDataStructHead
    {
    public ushort m_PacketType;
    public ushort m_wPacketNum;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct HisInfo
    {
    public ushort m_ID;
    public ushort m_HisType;
    }

    /// <summary>
    /// 需要重新定义
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class AskDataStruct : AskDataStructHead
    {
    [MarshalAs(UnmanagedType.LPArray, SizeConst = 3)]
    IntPtr[] m_His;
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class AskHisInfo
    {
    public byte m_DataType;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
    public string m_Extend;
    public long m_Start;
    public long m_End;
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class ASK_HISTORY_STRUCTBase : AskDataStructHead
    {
    public ushort m_cbSize; // 结构大小
    public ushort m_wMarket; // 市场类型
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码
    }

    /// <summary>
    /// 需要重新定义
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class ASK_HISTORY_STRUCT : ASK_HISTORY_STRUCTBase
    {
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public AskHisInfo[] m_Info;//最多支持同时申请八种类型
    }


    //补充日线数据
    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
    public struct RCV_HISTORY_STRUCTEx
    {
    [FieldOffset(0)]
    public long m_time;
    [FieldOffset(8)]
    public Single m_fOpen; //开盘
    [FieldOffset(12)]
    public Single m_fHigh; //最高
    [FieldOffset(16)]
    public Single m_fLow; //最低
    [FieldOffset(20)]
    public Single m_fClose; //收盘
    [FieldOffset(24)]
    public Single m_fVolume; //量
    [FieldOffset(28)]
    public Single m_fAmount; //额
    [FieldOffset(32)]
    public ushort m_wAdvance; //涨数,仅大盘有效
    [FieldOffset(34)]
    public ushort m_wDecline; //跌数,仅大盘有效
    [FieldOffset(32)]
    public Single m_fOI;

    [FieldOffset(0)]
    public IntPtr m_head;
    }

    //补充分时线数据
    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
    public struct RCV_MINUTE_STRUCTEx
    {
    [FieldOffset(0)]
    public long m_time; // UCT
    [FieldOffset(16)]
    public Single m_fPrice;
    [FieldOffset(20)]
    public Single m_fVolume;
    [FieldOffset(24)]
    public Single m_fAmount;
    [FieldOffset(0)]
    public IntPtr m_head;
    }

    //补充除权数据
    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
    public struct RCV_POWER_STRUCTEx
    {
    [FieldOffset(0)]
    public long m_time; // UCT
    [FieldOffset(16)]
    public Single m_fGive; // 每股送
    [FieldOffset(20)]
    public Single m_fPei; // 每股配
    [FieldOffset(24)]
    public Single m_fPeiPrice; // 配股价,仅当 m_fPei!=0.0f 时有效
    [FieldOffset(28)]
    public Single m_fProfit; // 每股红利
    [FieldOffset(0)]
    public IntPtr m_head;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct RCV_SHAGZ_STRUCTEx
    {
    public ushort m_wMarket; // 市场类型
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = STKLABEL_LEN)]
    public string m_szLabel; // 股票代码
    public ushort m_StartDate; //开始计算利息的日期 YYMMDD format
    public double m_fLiXi100RMB; //票面100员的
    public ushort m_DayNum;
    public Single m_fPrice;
    }

    //////////////////////////////////////////////////////////////////////////////////
    // 文件类型数据包头
    // 注一:
    // m_wDataType == FILE_BASE_EX
    // m_dwAttrib = 股票证券市场,m_szFileName仅包含文件名
    // m_FileTime = 基本面资料文件创建日期
    // m_wDataType == FILE_NEWS_EX
    // m_dwAttrib = 消息来源,m_szFileName 包含目录的文件名,目录名为消息来源
    // m_dwSerialNo = 序列号
    // 如: "上交所消息\\0501Z012.TXT","新兰德\\XLD0001.TXT"
    // m_wDataType == FILE_HTML_EX
    // m_dwAttrib 保留, m_szFileName为URL
    // m_wDataType == FILE_SOFTWARE_EX
    // m_dwAttrib 分析软件类型, 用于初步判断
    // m_szFileName 分析软件 ID 特征字符串 + '\\' + 文件名
    // 如 "TongShi\\TS\\RECEIVE\\RECEIVE.EXE",
    // ID 特征字符串为 "TongShi", "TS\\RECEIVE\\RECEIVE.EXE" 为文件名
    // 特征字符串 和 文件名及其含义由分析软件商定义
    // 注二:
    // 数据文件循环播出,每个文件有唯一的序列号,以避免重复接收
    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
    public struct RCV_FILE_HEADEx
    {
    [FieldOffset(0)]
    public uint m_dwAttrib; // 文件子类型
    [FieldOffset(4)]
    public uint m_dwLen; // 文件长度
    [FieldOffset(8)]
    public uint m_dwSerialNo; // 序列号,对股评
    [FieldOffset(8)]
    public long m_FileTime; // 文件创建时间
    [FieldOffset(20)]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string m_szFileName; // 文件名 or URL
    }


    //////////////////////////////////////////////////////////////////////////////////
    // 数据通知消息
    //查询方式通知消息
    // wParam = MsgPara_StkData 有股票数据
    // wParam = MsgPara_File 有文件数据文件
    //直接数据引用通知消息
    // wParam = RCV_WPARAM;
    // lParam 指向 RCV_DATA结构;
    // 返回 1 已经处理, 0 未处理或不能处理,目前该返回值被忽略

    // 注一:
    // 记录数表示行情数据和补充数据(包括 Header)的数据包数,对文件类型数据, = 1
    // 注二:
    // 若 m_bDISK = FALSE, m_pData 为数据缓冲区指针
    // ******** 数据共享,不能修改数据 **********
    // m_bDISK = TRUE, m_pData 为该文件的存盘文件名,一般情况只有
    // 升级软件等大文件用存盘方式
    //[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
    [StructLayout(LayoutKind.Sequential)]
    public struct RCV_DATA
    {
    //[FieldOffset(0)]
    public int m_wDataType; // 文件类型
    //[FieldOffset(4)]
    public int m_nPacketNum; // 记录数,参见注一
    //[FieldOffset(8)]
    public RCV_FILE_HEADEx m_File; // 文件接口
    //[FieldOffset(8)]
    //[MarshalAs(UnmanagedType.I4)]
    public int m_bDISK; // 文件是否已存盘的文件

    public IntPtr ptr;

    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_REPORT_STRUCTEx[] m_pReport;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_REPORT_STRUCTEx1[] m_pReport1;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_REPORT_STRUCTEx2[] m_pReport2;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_HISTORY_STRUCTEx[] m_pDay;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_MINUTE_STRUCTEx[] m_pMinute;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.ByValArray)]
    //public RCV_POWER_STRUCTEx[] m_pPower;
    //[FieldOffset(292)]
    //[MarshalAs(UnmanagedType.AsAny)]
    //public object m_pData; // 参见注二
    }



    private RichTextBox richTextBox1;
    private Button button2;
    private Button button1;

    // 注册函数

    // 股票初始化
    // 入口参数:
    // hWnd 处理消息的窗口句柄
    // Msg 用户自定义消息
    // nWorkMode 接口工作方式, 应等于 RCV_WORK_SENDMSG
    // 返回参数:
    // 1 成功
    // -1 失败
    [DllImport("jet158.dll")]
    private static extern int Stock_Init(IntPtr hWnd, uint Msg, int nWorkMode);

    // 退出,停止发送消息
    // 入口参数:
    // hWnd 处理消息的窗口句柄,同 Stock_Init 的调用入口参数
    // 返回参数:
    // 1 成功
    // -1 失败
    [DllImport("jet158.dll")]
    private static extern int Stock_Quit(IntPtr hWnd);
    //////////////////////////////////////////////////////////////////////////////////
    // 行情接口

    // 取已接收到的股票总数
    [DllImport("jet158.dll")]
    private static extern int GetTotalNumber();

    // 由序号取股票数据(扩展)
    // 入口参数:
    // nNo 序号
    // pBuf 存放股票数据的缓冲区
    // 返回参数:
    // NoStockData 无股票数据
    // 注:
    // 该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架
    [DllImport("jet158.dll")]
    private static extern int GetStockByNoEx(int nNo, [MarshalAs(UnmanagedType.LPStruct)]RCV_REPORT_STRUCTEx pBuf);

    // 由股号取股票数据(扩展)
    // 入口参数:
    // pszStockCode股票代号
    // nMarket 证券市场
    // pBuf 存放股票数据的缓冲区
    // 返回参数:
    // NoStockData 无股票数据
    // 注:
    // 该函数提供股票数据的主要数据;分析软件刚运行时,可以快速建立数据框架
    //[DllImport("jet158.dll")]
    //private static extern int GetStockByCodeEx(char* pszStockCode, int nMarket, RCV_REPORT_STRUCTEx* pBuf);

    // 激活接收程序,进行设置
    // 入口参数:
    // bShowWindow TRUE 显示窗口,进行设置
    // FALSE 隐含窗口
    // 返回参数:
    // 1 成功
    // -1 失败
    //[DllImport("jet158.dll")] //private static extern int SetupReceiver(BOOL bShowWindow);

    // 取得股票驱动信息
    // 入口参数:
    // nInfo 索引
    // pBuf 缓冲区
    // 出口参数:
    // nInfo == RI_IDSTRING, 返回特征字符串长度, pBuf 为特征字符串
    // 如: "TongShi_StockDrv_1.00"
    // nInfo == RI_IDCODE, 返回信息卡 ID 号, pBuf 为字符串形式的 ID 号
    // 如: 0x78001234 "78001234"
    // nInfo == RI_VERSION, 返回信息卡版本号, pBuf 为字符串版本
    // 如: 1.00 "1.00"
    // nInfo == RI_ERRRATE, 取信道误码,
    // nInfo == RI_STKNUM, 取上市股票总家数
    [DllImport("jet158.dll")]
    private static extern int GetStockDrvInfo(int nInfo, [MarshalAs(UnmanagedType.AsAny)] object pBuf);

    public StockDataDriver()
    {
    InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
    switch (m.Msg)
    {
    case My_Msg_StkData:
    RCV_DATA pHeader = (RCV_DATA)m.GetLParam(typeof(RCV_DATA));
    if (pHeader.ptr != IntPtr.Zero)
    {
    RCV_REPORT_STRUCTEx pRCV_REPORT_STRUCTEx = (RCV_REPORT_STRUCTEx)Marshal.PtrToStructure(pHeader.ptr, typeof(RCV_REPORT_STRUCTEx));
    ushort nBufSize = pRCV_REPORT_STRUCTEx.m_cbSize;
    this.richTextBox1.Text = "";

    switch (m.WParam.ToInt32())
    {
    case RCV_REPORT:
    {
    for (int i = 0; i < pHeader.m_nPacketNum; i++)
    {
    RCV_REPORT_STRUCTEx report = (RCV_REPORT_STRUCTEx)Marshal.PtrToStructure(new IntPtr(pHeader.ptr.ToInt32() + nBufSize * i), typeof(RCV_REPORT_STRUCTEx));
    this.richTextBox1.Text += String.Format("%6s %8s %8.3f %8.3f %8.3f %8.3f %8.3f %10.0f %10.f\n", new string(report.m_szLabelName, 0, 6), new string(report.m_szLabelName, 10, 16), report.m_fNewPrice, report.m_fOpen, report.m_fLastClose, report.m_fHigh, report.m_fLow, report.m_fVolume, report.m_fAmount);
    }
    break;


    }
    }
    }
    break;
    default:
    base.WndProc(ref m);
    break;
    }
    }


    public void GetKMIN5()
    {
    //IntPtr ptrs = Marshal.AllocHGlobal(128);
    //char[] SupportExtHQ = new char[128];
    //int i = GetStockDrvInfo(RI_SUPPORTEXTHQ, SupportExtHQ);

    //string SupportExtHQ = Marshal.PtrToStringAnsi(ptrs);

    //MessageBox.Show(SupportExtHQ.to);
    int ok = Stock_Init(this.Handle, My_Msg_StkData, RCV_WORK_SENDMSG);

    //ASK_HISTORY_STRUCT ask = new ASK_HISTORY_STRUCT();

    //ask.m_wPacketNum = 1;
    //ask.m_wMarket = SH_MARKET_EX;
    //ask.m_szLabel = "600000"; ;
    //ask.m_PacketType = 23;
    //ask.m_wPacketNum = 1;
    //ask.m_Info = new AskHisInfo[8];


    //AskHisInfo ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    ////ahi.m_Extend[0] = (char)0;
    ////ahi.m_Extend[1] = (char)0;
    ////ahi.m_Extend[2] = (char)0;
    //ask.m_Info[0] = ahi;
    //ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    //ask.m_Info[1] = ahi;
    //ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    //ask.m_Info[2] = ahi;
    //ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    //ask.m_Info[3] = ahi;
    //ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    //ask.m_Info[4] = ahi;
    //ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    //ask.m_Info[5] = ahi;
    //ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    //ask.m_Info[6] = ahi;
    //ahi = new AskHisInfo();
    //ahi.m_Extend = "";
    //ask.m_Info[7] = ahi;
    //ask.m_Info[0].m_DataType = (byte)2;

    //ushort len = (ushort)(Marshal.SizeOf(typeof(ASK_HISTORY_STRUCTBase)) + ask.m_wPacketNum * Marshal.SizeOf(typeof(AskHisInfo)));
    //ask.m_cbSize = len;

    //IntPtr ptrs = Marshal.AllocHGlobal(len);
    //Marshal.StructureToPtr(ask, ptrs, true);


    //ok = GetStockDrvInfo(RI_ASKDATA, ask);
    //Marshal.FreeHGlobal(ptrs);


    }



    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new StockDataDriver());
    }

    private void InitializeComponent()
    {
    this.button1 = new System.Windows.Forms.Button();
    this.richTextBox1 = new System.Windows.Forms.RichTextBox();
    this.button2 = new System.Windows.Forms.Button();
    this.SuspendLayout();
    //
    // button1
    //
    this.button1.Location = new System.Drawing.Point(1040, 572);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(37, 23);
    this.button1.TabIndex = 0;
    this.button1.Text = "button1";
    this.button1.UseVisualStyleBackColor = true;
    this.button1.Click += new System.EventHandler(this.button1_Click);
    //
    // richTextBox1
    //
    this.richTextBox1.Location = new System.Drawing.Point(3, 3);
    this.richTextBox1.Name = "richTextBox1";
    this.richTextBox1.Size = new System.Drawing.Size(1021, 653);
    this.richTextBox1.TabIndex = 1;
    this.richTextBox1.Text = "";
    //
    // button2
    //
    this.button2.Location = new System.Drawing.Point(1050, 115);
    this.button2.Name = "button2";
    this.button2.Size = new System.Drawing.Size(37, 23);
    this.button2.TabIndex = 2;
    this.button2.Text = "button2";
    this.button2.UseVisualStyleBackColor = true;
    this.button2.Click += new System.EventHandler(this.button2_Click);
    //
    // StockDataDriver
    //
    this.ClientSize = new System.Drawing.Size(1127, 668);
    this.Controls.Add(this.button2);
    this.Controls.Add(this.richTextBox1);
    this.Controls.Add(this.button1);
    this.Name = "StockDataDriver";
    this.ResumeLayout(false);

    }

    private void button1_Click(object sender, EventArgs e)
    {
    GetKMIN5();
    }

    }




    如下程序行出错:
    RCV_REPORT_STRUCTEx pRCV_REPORT_STRUCTEx = (RCV_REPORT_STRUCTEx)Marshal.PtrToStructure(pHeader.ptr, typeof(RCV_REPORT_STRUCTEx));

    请高手指教
     
  2. 我的语句是这样的(没有核对相应struct你我是否定义一致,可以参考我有关的帖子):

    RCV_DATA data=(RCV_DATA)m.GetLParam(typeof(RCV_DATA));
    for(int i=0;i<data.m_nPacketNum;i++)
    {
    RCV_REPORT_STRUCTExV3 report=(RCV_REPORT_STRUCTExV3)Marshal.PtrToStructure
    (new IntPtr((int)data.ptr+158* i),typeof(RCV_REPORT_STRUCTExV3));
    }

    [ StructLayout( LayoutKind.Explicit )]
    public struct RCV_REPORT_STRUCTExV3
    {
    [ FieldOffset( 0 )]public System.UInt16 m_cbSize; // 结构大小
    [ FieldOffset( 2 )]public System.UInt32 m_time; // 成交时间
    [ FieldOffset( 6 )]public System.UInt16 m_wMarket; // 股票市场类型

    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=42)]
    [ FieldOffset( 8 )]public char[] m_szLabelName; // 股票代码,以'\0'结尾
    //
    // [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=32 )]
    // [ FieldOffset( 18 )]public string m_szName; // 股票名称,以'\0'结尾
    // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=STKLABEL_LEN-1 )]
    // public char[] m_szLabel; // 股票代码,以'\0'结尾
    // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=STKNAME_LEN-1 )]
    // public char[] m_szName; // 股票名称,以'\0'结尾

    [ FieldOffset( 50 )]public System.Single m_fLastClose; // 昨收
    [ FieldOffset( 54 )]public System.Single m_fOpen; // 今开
    [ FieldOffset( 58 )]public System.Single m_fHigh; // 最高
    [ FieldOffset( 62 )]public System.Single m_fLow; // 最低
    [ FieldOffset( 66 )]public System.Single m_fNewPrice; // 最新
    [ FieldOffset( 70 )]public System.Single m_fVolume; // 成交量
    [ FieldOffset( 74 )]public System.Single m_fAmount; // 成交额

    // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )]
    [ FieldOffset( 78 )]public System.Single m_fBuyPrice1; // 申买价1
    [ FieldOffset( 82 )]public System.Single m_fBuyPrice2; // 申买价2
    [ FieldOffset( 86 )]public System.Single m_fBuyPrice3; // 申买价3
    [ FieldOffset( 90 )]public System.Single m_fBuyVolume1; // 申买量1
    [ FieldOffset( 94 )]public System.Single m_fBuyVolume2; // 申买量2
    [ FieldOffset( 98 )]public System.Single m_fBuyVolume3; // 申买量3
    [ FieldOffset( 102 )]public System.Single m_fSellPrice1; // 申卖价1
    [ FieldOffset( 106 )]public System.Single m_fSellPrice2; // 申卖价2
    [ FieldOffset( 110 )]public System.Single m_fSellPrice3; // 申卖价3
    [ FieldOffset( 114 )]public System.Single m_fSellVolume1; // 申卖量1
    [ FieldOffset( 118 )]public System.Single m_fSellVolume2; // 申卖量2
    [ FieldOffset( 122 )]public System.Single m_fSellVolume3; // 申卖量3

    // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )]
    // [ FieldOffset( 0 )]public System.Single[] m_fBuyVolume; // 申买量1,2,3
    // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )]
    // [ FieldOffset( 0 )]public System.Single[] m_fSellPrice; // 申卖价1,2,3
    // [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )]
    // [ FieldOffset( 0 )]public System.Single[] m_fSellVolume; // 申卖量1,2,3

    [ FieldOffset( 126 )]public System.Single m_fBuyPrice4; // 申买价4
    [ FieldOffset( 130 )]public System.Single m_fBuyVolume4; // 申买量4
    [ FieldOffset( 134 )]public System.Single m_fSellPrice4; // 申卖价4
    [ FieldOffset( 138 )]public System.Single m_fSellVolume4; // 申卖量4

    [ FieldOffset( 142 )]public System.Single m_fBuyPrice5; // 申买价5
    [ FieldOffset( 146 )]public System.Single m_fBuyVolume5; // 申买量5
    [ FieldOffset( 150 )]public System.Single m_fSellPrice5; // 申卖价5
    [ FieldOffset( 154 )]public System.Single m_fSellVolume5;
    }

    [ StructLayout( LayoutKind.Sequential )]
    public struct RCV_DATA
    {
    public System.Int32 m_wDataType; // 文件类型
    public System.Int32 m_nPacketNum; // 记录数,参见注一
    public RCV_FILE_HEADEx m_File; // 文件接口
    public System.Int32 m_bDISK;
    // [ MarshalAs( UnmanagedType.LPArray)]
    // public RCV_REPORT_STRUCTExV3[] rpt;
    // [ MarshalAs( UnmanagedType.AsAny)]
    public IntPtr ptr;
    // public rcvdata data;
    }
    [ StructLayout( LayoutKind.Sequential )]
    public struct RCV_FILE_HEADEx
    {
    public System.UInt32 m_dwAttrib; // 文件子类型
    public System.UInt32 m_dwLen; // 文件长度
    public System.UInt32 m_dwSerialNo; // 序列号
    [ MarshalAs( UnmanagedType.ByValTStr , SizeConst=260 )]
    public string m_szFileName; // 文件名 or URL
    }
     
  3. 请教通视数据接口接收时时行情数据以及转为.txt格式

    各位高手:

    大家好!

    我想接收数畅信息平台的股票价格行情数据,通过数据接口把数据时时接收到本地电脑中,数据格式转化为文本格式;(数据接口按照标准的通视格式)

    然后,利用我的统计软件读这个文本格式的数据,进行统计计算。


    有哪位高手能帮下忙?谢谢

    zgq123
     
  4. 请问 tom_sh 您用c#读出日线数据,除权数据等这些数据了么?
     
  5. 很久没见逆云飞雪的贴子了,补一下连续两年的新年好!
     
  6. 我自己主要用TICK数据,不太用到BAR和其他类型,以前编数畅接口时有试过收其他类型数据,应该是可以的。
     
  7. zwz

    zwz

    可以.
    WndProc部分参照下面的C#代码改一改:
    Code:
    protected override void WndProc(ref Message m)
            {
                try
                {
                    int i, offset, stockrecsize;
                    // short nIndex;
                    //ushort wMarket;
                    //SCMarket pscm;
    
    
                    if (m.Msg == WM_USER)
                    {
                        // Console.WriteLine("开始接收。。。");
                        SCHead pHead = (SCHead)m.GetLParam(typeof(SCHead));
                        switch (pHead.m_nType)
                        {
                            case SC_MARKET:
                                {
                                    SC_MarketReply psc = (SC_MarketReply)m.GetLParam(typeof(SC_MarketReply));
                                    //Console.WriteLine("接收市场数据...");
                                    offset = Marshal.SizeOf(typeof(SC_MarketReply));
                                    stockrecsize = Marshal.SizeOf(typeof(StockInfo));
                                    MKTDATA = psc.m_Market;
    
                                    for (i = 0; i < psc.m_Market.m_nCount; i++)
                                    {
                                        StockInfo record = (StockInfo)Marshal.PtrToStructure
                                           (new IntPtr(m.LParam.ToInt32() + stockrecsize * i +
                                           Marshal.SizeOf(typeof(SC_MarketReply))), typeof(StockInfo));
    
                                        SC_CODETABLE.addData(psc.m_Market.scmarketcode, (short)i, record);
                                        string dm = record.m_szLabel.Trim() + "." + psc.m_Market.scmarketcode.Trim().ToUpper();
                                        if (!Symbols.Contains(dm)) Symbols.Add(dm);//zzz
                                    }
                                    if (!MarketDate.ContainsKey(psc.m_Market.scmarketcode))
                                        MarketDate.Add(psc.m_Market.scmarketcode, DateTime.ParseExact(psc.m_Market.m_lDate.ToString(), "yyyyMMdd", null)); ;
                                    //Console.WriteLine(string.Format("市场{0},日期{1},证券数{2},开市{3},收市{4},时段数{5}",
                                    //    psc.m_Market.scmarketcode, DateTime.ParseExact(psc.m_Market.m_lDate.ToString(), "yyyyMMdd", null), psc.m_Market.m_nCount,
                                    //    psc.m_Market.m_OpenTime[0], psc.m_Market.m_CloseTime[0], psc.m_Market.m_PeriodCount));
    
                                }
                                break;
                            case SC_NOWDATA:
                                {
                                    try
                                    {
                                        SC_NowDataReply pnr = (SC_NowDataReply)m.GetLParam(typeof(SC_NowDataReply));
                                        //Console.WriteLine("正在接收 SC_nowdata");
                                        if (pnr.m_nCount > 0)
                                        {
                                            offset = Marshal.SizeOf(typeof(SC_NowDataReply));
                                            stockrecsize = Marshal.SizeOf(typeof(RCV_NOW_STRUCTEx));
    
                                            for (i = 0; i < pnr.m_nCount; i++)
                                            {
                                                RCV_NOW_STRUCTEx record = (RCV_NOW_STRUCTEx)Marshal.PtrToStructure(
                                                    new IntPtr(m.LParam.ToInt32() + offset + stockrecsize * i), typeof(RCV_NOW_STRUCTEx));
                                                string wmarket = GetMarketName(record.m_sID.m_wMarket);
    
                                                string Symbol = SC_CODETABLE.GetSymbolCode(wmarket, record.m_sID.m_nIndex) + "." + wmarket.Trim();
    
                                                //Console.WriteLine("{0}\t {1} \t{2}\t {3}\t{4} \t{5}\t{6}",record.m_sID.m_wMarket, record.m_sID.m_nIndex,
                                                //stock.m_szLabel ,stock .m_szName , record.m_fNewPrice , record.m_fVolume,record.m_lStroke);
                                                if (OnQuote != null)
                                                {
                                                    OnQuote(this, Symbol, record);
                                                }
                                            }
    
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        StMyFunction.textwrite(string.Format
                                            ("time:{0} \t  SC_NOW 出错:{1} \t {2} case is :{3}  ", DateTime.Now, ex.Message, ex.InnerException, ex.Source.ToString()));
                                    }
                                }
    
                                break;
                            case SC_KLINE:
                                {
                                    SC_KLineReply pk = (SC_KLineReply)m.GetLParam(typeof(SC_KLineReply));
                                    offset = Marshal.SizeOf(typeof(SC_KLineReply));
                                    stockrecsize = Marshal.SizeOf(typeof(RCV_HISTORY_STRUCTEx));
    
    
                                    // StockInfo stockinfo = SC_CODETABLE.GetStockInfo(GetMarketName(pk.m_sID.m_wMarket), pk.m_sID.m_nIndex);
                                    //Console.WriteLine("{0}\t {1} \t ", stockinfo.m_szLabel, stockinfo.m_szName);
                                    List<RCV_HISTORY_STRUCTEx> Records = new List<RCV_HISTORY_STRUCTEx>();
                                    switch (pk.m_wDataType)
                                    {
                                        case KLINE_DAYDATA:
                                            //    Console.WriteLine("日线");
    
    
                                            for (i = 0; i < pk.m_lDataCount; ++i)
                                            {
                                                RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure
                                                      (new IntPtr(m.LParam.ToInt32() + stockrecsize * i +
                                                      offset), typeof(RCV_HISTORY_STRUCTEx));
                                                //DateTime mtime = new DateTime(1970, 1, 1).AddSeconds(record.m_time).ToLocalTime();
                                                //Console.WriteLine("{0}\t {1}\t {2}\t ", mtime, record.m_fClose, record.m_fVolume);
                                                Records.Add(record);
    
                                            }
                                            if (OnSC_KLINE != null)
                                            {
                                                string wmarket1 = GetMarketName(pk.m_sID.m_wMarket);
                                                string symbol1 = SC_CODETABLE.GetSymbolCode(wmarket1, pk.m_sID.m_nIndex) + "." + wmarket1.Trim();
                                                OnSC_KLINE(this, pk.m_Head.m_lIndex, symbol1, Records);
                                            }
    
                                            break;
                                        case KLINE_MIN5DATA:
                                            //      Console.WriteLine("5Min :共有{0}  个记录", pk.m_lDataCount);
    
    
                                            for (i = 0; i < pk.m_lDataCount; ++i)
                                            {
                                                RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure
                                                     (new IntPtr(m.LParam.ToInt32() + stockrecsize * i +
                                                     offset), typeof(RCV_HISTORY_STRUCTEx));
    
                                                //Console.WriteLine("{0}\t {1}\t {2}\t ", m_timeToDateTime(record.m_time), record.m_fClose, record.m_fVolume);
                                                Records.Add(record);
                                            }
                                            if (OnSC_KLINE != null)
                                            {
                                                string wmarket = GetMarketName(pk.m_sID.m_wMarket);
                                                string symbol = SC_CODETABLE.GetSymbolCode(wmarket, pk.m_sID.m_nIndex) + "." + wmarket.Trim();
                                                OnSC_KLINE(this, pk.m_Head.m_lIndex, symbol, Records);
                                            }
    
                                            break;
                                    }
                                }
    
                                break;
                            case SC_PANKOU:
                                {
                                    //StMyFunction .textwrite(string .Format ("time:{0} 正在接收盘口数据....",DateTime .Now ));
                                    SC_PankouReply pp = (SC_PankouReply)m.GetLParam(typeof(SC_PankouReply));
                                    offset = Marshal.SizeOf(typeof(SC_PankouReply));
                                    stockrecsize = Marshal.SizeOf(typeof(RCV_PANKOU_STRUCTEx));
    
                                    //StockInfo stockinfo = SC_CODETABLE.GetStockInfo(GetMarketName(pp.m_sID.m_wMarket), pp.m_sID.m_nIndex);
                                    //StMyFunction.textwrite(string.Format("{0}\t {1} \t reccount:{2} ", 
                                    //                       stockinfo.m_szLabel, stockinfo.m_szName, pp, pp.m_lCount));
                                    if (pp.m_lCount > 0)
                                    {
                                        List<RCV_PANKOU_STRUCTEx> Records = new List<RCV_PANKOU_STRUCTEx>();
                                        for (i = 0; i < pp.m_lCount; ++i)
                                        {
                                            RCV_PANKOU_STRUCTEx record = (RCV_PANKOU_STRUCTEx)Marshal.PtrToStructure
                                                          (new IntPtr(m.LParam.ToInt32() + stockrecsize * i +
                                                          offset), typeof(RCV_PANKOU_STRUCTEx));
    
                                            //StMyFunction.textwrite(string.Format("{0}\t {1}\t {2}\t {3} \t", m_timeToDateTime(record.m_time), record.m_fNewPrice, record.m_fVolume, record.m_lStroke));
                                            if (record.m_fNewPrice > 0)   //最新价为零不增加list
                                            {
                                                Records.Add(record);
                                            }
                                        }
                                        //StMyFunction.textwrite(string.Format("fished !! count:{0} lindex:{1}", Records.Count, pp.m_Head.m_lIndex));
                                        if (OnSC_PANKUO != null)
                                        {
                                            OnSC_PANKUO(this, pp.m_Head.m_lIndex, Records);
                                        }
                                    }
                                }
                                break;
                            case SC_CQ:
    
                                Console.WriteLine("SC_CQ");
                                break;
                            case SC_IMTYPELIST:
                                {
                                    SC_IMTypeReply pt = (SC_IMTypeReply)m.GetLParam(typeof(SC_IMTypeReply));
                                    Console.WriteLine("SC_IMTypeReply");
                                }
                                break;
                            case SC_IMTITLE:
                                SC_IMTitleReply ptr = (SC_IMTitleReply)m.GetLParam(typeof(SC_IMTitleReply));
                                Console.WriteLine("SC_IMTitleReply");
                                break;
                            case SC_IMCONTENT:
                                {
                                    Console.WriteLine("SC_imcontent");
                                }
                                break;
                            case SC_DL_KLINE:		// 日k线下载
                                {
                                    SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download));
                                    offset = Marshal.SizeOf(typeof(SC_Download));
                                    stockrecsize = Marshal.SizeOf(typeof(RCV_HISTORY_STRUCTEx));
                                    //Console.WriteLine("收到下载日线数据:"+pdl.m_lCount);
                                    for (i = 0; i < pdl.m_lCount; i++)
                                    {
                                        RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure
                                           (new IntPtr(m.LParam.ToInt32() + stockrecsize * i +
                                           offset), typeof(RCV_HISTORY_STRUCTEx));
    
                                        //Console.WriteLine(string.Format("{0} \t {1} \t {2} \t   \r\n",
                                        //    m_timeToDateTime(record.m_time), record.m_fClose, record.m_fVolume));
                                    }
                                }
                                break;
                            case SC_DL_5MIN:		// 五分钟k线下载
                                {
                                    SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download));
                                    offset = Marshal.SizeOf(typeof(SC_Download));
                                    stockrecsize = Marshal.SizeOf(typeof(RCV_HISTORY_STRUCTEx));
                                    //Console.WriteLine(string.Format("收到下载五分钟数据 {0} ", pdl.m_lCount));
                                    for (i = 0; i < pdl.m_lCount; i++)
                                    {
                                        RCV_HISTORY_STRUCTEx record = (RCV_HISTORY_STRUCTEx)Marshal.PtrToStructure
                                           (new IntPtr(m.LParam.ToInt32() + stockrecsize * i +
                                          offset), typeof(RCV_HISTORY_STRUCTEx));
    
                                        //Console.WriteLine(string.Format("{0} \t {1} \t {2} \t   \r\n",
                                        //    m_timeToDateTime(record.m_time), record.m_fClose, record.m_fVolume));
                                    }
                                }
                                break;
                            case SC_DL_CQ:			// 除权数据下载
                                {
                                    SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download));
                                    offset = Marshal.SizeOf(typeof(SC_Download));
                                    stockrecsize = Marshal.SizeOf(typeof(RCV_POWER_STRUCTEx));
                                    Console.WriteLine("收到下载除权数据 ");
                                    for (i = 0; i < pdl.m_lCount; i++)
                                    {
                                        RCV_POWER_STRUCTEx record = (RCV_POWER_STRUCTEx)Marshal.PtrToStructure
                                           (new IntPtr(m.LParam.ToInt32() + stockrecsize * i +
                                          offset), typeof(RCV_POWER_STRUCTEx));
    
                                        Console.WriteLine(string.Format("{0} \t {1} \t {2} \t   \r\n",
                                            m_timeToDateTime(record.m_time), record.m_fGive, record.m_fPei));
                                    }
    
                                }
                                break;
                            case SC_DL_XX:			// 资讯数据下载:交易所公告、信息地雷、新闻、综合等
                                {
                                    /*//SC_Download *pdl = (SC_Download *)lParam;
                                    switch ( pdl->m_cClass ) {
                                    case CLASS_JYSXX:
                                        sprintf(strText, "收到下载交易所公告 %d 个", pdl->m_lCount);
                                        break;
                                    case CLASS_STKINFO:
                                        sprintf(strText, "收到下载历史信息地雷 %d 个", pdl->m_lCount);
                                        break;
                                    case CLASS_NEWS:
                                        sprintf(strText, "收到下载新闻 %d 个", pdl->m_lCount);
                                        break;
                                    case CLASS_STOCKBASE:
                                        sprintf(strText, "收到下载F10 %d 个", pdl->m_lCount);
                                        break;
                                    case CLASS_MKTINFO:
                                        sprintf(strText, "收到下载综合资讯 %d 个", pdl->m_lCount);
    				                  
                                 
                                     break;
                                    default:
                                        break;
                                    }
                                    SetDlgItemText(IDC_DOWN_LOAD, strText);
                                }
                                     *     */
                                    Console.WriteLine("SC_DLXX");
                                }
                                break;
                            case SC_DL_TRACE:		// 分笔明细下载
                                {
                                    SC_Download pdl = (SC_Download)m.GetLParam(typeof(SC_Download));
                                    offset = Marshal.SizeOf(typeof(SC_Download));
                                    stockrecsize = Marshal.SizeOf(typeof(RCV_PANKOU_STRUCTEx));
                                    Console.WriteLine("收到下载分笔数据 " + pdl.m_lCount.ToString());
    
                                    for (i = 0; i < pdl.m_lCount; i++)
                                    {
                                        RCV_PANKOU_STRUCTEx record = (RCV_PANKOU_STRUCTEx)Marshal.PtrToStructure
                                           (new IntPtr(m.LParam.ToInt32() + stockrecsize * i + offset), typeof(RCV_PANKOU_STRUCTEx));
    
                                        Console.WriteLine(string.Format("{0} \t {1} \t {2} \t  {3} \r\n",
                                          m_timeToDateTime(record.m_time), record.m_fNewPrice, record.m_fVolume, record.m_fBuyPrice[0]));
    
                                    }
    
                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    StMyFunction.textwrite(string.Format("time:{0} \t接收出错:{1} \t case is :{2} ", DateTime.Now, ex.Message, ex.Source.ToString()));
                }
                base.WndProc(ref m);
            }
    
     
  8. GetMarketName 函数的源码

    GetMarketName

    这个函数的源码
    我读出全是乱码
     
  9. public string GetMarketName(ushort w_market)
    {
    string re_marketname = System.Text.Encoding.ASCII.GetString(BitConverter.GetBytes(w_market));
    return re_marketname.Trim();
    }
     
  10. 谢谢,
     
  11. 谢谢fisher,
    可否给出这个文件的全部源码
     
  12. 谢谢zwz
     
  13. case 0x2201: //当前行情数据
    try
    {
    SC_NowDataReply_s mNow = (SC_NowDataReply_s)mMessage.GetLParam(typeof(SC_NowDataReply_s));
    if (mNow.m_nCount > 0)
    {
    offset = Marshal.SizeOf(typeof(SC_NowDataReply_s));
    stockrecsize = Marshal.SizeOf(typeof(RCV_NOW_STRUCTEx));

    for (num = 0; num < mNow.m_nCount; num++)
    {
    try
    {
    RCV_NOW_STRUCTEx record = (RCV_NOW_STRUCTEx)Marshal.PtrToStructure( new IntPtr(mMessage.LParam.ToInt32() + offset + (stockrecsize * num)), typeof(RCV_NOW_STRUCTEx));
    wmarket = GetMarketName(record.m_sID.m_wMarket);

    Symbol = SC_CodeTable.GetSymbolCode(wmarket, record.m_sID.m_nIndex) + "." + wmarket.Trim();

    if (this.m_NOW_delegate != null)
    {
    this.m_NOW_delegate(this, Symbol, record);
    }
    }
    catch
    {
    }

    }//for

    }
    }
    catch (Exception exception)
    {
    ClsTool.WriteToLog(string.Format("time:{0} \t SC_NOW 出错:{1} \t {2} case is :{3} ", new object[] { DateTime.Now, exception.Message, exception.InnerException, exception.Source.ToString() }));
    }
    break;
    红色代码部分,经常出现异常 System.ExecutionEngineException
    请高手修改一下!!!!!调用的是 数畅4.03(测试用户)
     
  14. 是结构出了问题
     
  15. 接收银江数据时无法捕获自定义消息

    下面是一则短程序,逻辑步骤:
    1、点击按钮,启动银江接口
    2、在wndproc函数中捕获该消息,并加以处理

    遇到的问题:在debug模式下,单步执行的时候可以捕捉用户自定义消息,但是在release模式下执行,看不到消息被捕获的log。

    不知这是为何,请大侠指教。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.IO;

    namespace ntest
    {
    public partial class TongshiWindow : Form
    {
    private const int TSMSG = 0x8000 + 1;
    private const int RCV_WORK_SENDMSG = 4;
    public bool Drvloaded = false;

    public TongshiWindow()
    {
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"WriteLines2.txt"))
    {
    file.WriteLine("for debug use");
    }

    InitializeComponent();
    }

    [DllImport("Stock.dll")]
    public static extern int Stock_Init(int hWnd, uint Msg, int nWorkMode);

    [DllImport("Stock.dll")]
    public static extern int Stock_Quit(int hWnd);

    public void DrvInit()
    {
    Drvloaded = true;
    Stock_Init(this.Handle.ToInt32(), TSMSG, RCV_WORK_SENDMSG);
    }

    public void DrvQuit()
    {
    if (Drvloaded)
    {
    Stock_Quit(this.Handle.ToInt32());
    Drvloaded = false;
    }
    }
    protected override void WndProc(ref Message m)
    {
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"WriteLines2.txt", true))
    {
    file.WriteLine("msg:" + m.Msg.ToString() + " " + TSMSG.ToString() + " " + (m.Msg == TSMSG).ToString());
    }

    if (m.Msg == TSMSG && Drvloaded)
    {
    MessageBox.Show("TSMSG");
    }
    base.WndProc(ref m);
    }

    private void button1_Click(object sender, EventArgs e)
    {
    DrvInit();
    }
    }
    }
     
  16. gxj

    gxj

    我自己做了一个,C写得,楼主现在还需要吗?
     
  17. 能给我一份么,多谢!5imentor@163.com
     
  18. 用红璟,最新版马上就推出了,可以下载证券、期货的tick行情