量化金融小初探

用C#访问IFind的简单例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
//using Newtonsoft.Json;
using System.Text.RegularExpressions;
using System.Threading;

namespace ConsoleiFind
{    
    class Program
    {
        /*
         * D:iFinDReleaseiFinDinx86:该目录是用户本地的iFinD安装目录且修复的位数是32位,如果是64位则目录为D:iFinDReleaseiFinDinx64
         * FTDataInterface.dll为接口文件,该文件是32位的,如果是64位,则文件名称为FTDataInterface_x64.dll
         */

        //当前FTDataInterface.dll或者FTDataInterface_x64.dll文件的获取可以通过修复C++接口得到:【iFinD终端-工具-数据接口-C++修复文件】
        const string strPath = @"D:\金融\DataInterface_free_Windows\bin\x64\";
        const string strDllFileName = "FTDataInterface_x64.dll";        
        const string strDllFile = strPath + strDllFileName;

        static void Main(string[] args)
        {
            /*登录函数
         
             */
            string strUserName = "";
            string strPassWord = "";
            int nRet = THS_iFinDLogin(strUserName, strPassWord);
           string strOut = "Login result:" + nRet;
           Console.WriteLine(strOut);

            _event = new AutoResetEvent(false);
            ThreadStart threadStart = new ThreadStart(testSample);
            Thread thread = new Thread(threadStart);
            thread.Start();
            _event.WaitOne();

            //登出函数
            nRet = THS_iFinDLogout();
          strOut = "Logout result:" + nRet;
         Console.WriteLine(strOut);

            Console.ReadLine();
        }

        private static AutoResetEvent _event;
        public static void testSample()
        {
            //高频序列函数
            HighFrequenceSequenceSample();

            //实时行情函数
            RealtimeQuotesSample();

            //历史行情函数
            HistoryQuotesSample();

            //基础数据函数
            BasicDataSample();

            //日期序列函数
            DateSequenceSample();

            //数据池函数
            DataPoolSample();

            //EDB数据请求函数
            EDBQuerySample();

            //数据使用量统计函数
            DataStatisticsSample();

            //错误信息查询函数
            GetErrorInfoSample();

            //日期请求函数
            DateQuerySample();

            //日期偏移函数
            DateOffsetSample();

            //日期统计函数
            DateCountSample();

            Thread.Sleep(3000);
            _event.Set();

        }

        static void HighFrequenceSequenceSample()
        {
            string strOut;
            //请求高频数据  传递5个字符串参数,返回数据
            /*高频序列函数格式为THS_HighFrequenceSequence('thsCodes','indicators','params','startTime','endTime')
             * thsCodes不可以为空,且支持多个输入,当有多个thsCodes则用英文半角逗号分隔,如thsCode1,thsCode2,thsCode3
             * indicators不可以为空,且支持多个输入,当有多个indicators则用英文半角分号分隔,如indicator1;indicator2;indicator3
             * params不可以为空,且支持多个输入,当使用默认的参数时可以使用'default'表示,当用户只对其中某个指标设定而其他参数保持默认时,只需要输入设定的参数即可,如'Interval:5'
             * startDate的日期输入格式为YYYY-MM-DD HH:MM:SS
             * endDate的日期输入格式为YYYY-MM-DD HH:MM:SS
             * THS_HighFrequenceSequence('thsCode1,thsCode2,thsCode3','indicator1;indicator2;indicator3','param1,param2,param3','startTime','endTime')
             */
            strOut = THS_HighFrequenceSequence("600000.SH,300033.SZ", "open;high", "CPS:1,Interval:5,Fill:Previous", "2016-09-01 09:30:00", "2016-09-01 15:30:00");
            //高频序列函数
            Console.WriteLine("高频序列函数");
            Console.WriteLine(strOut);
        }

        static void RealtimeQuotesSample()
        {
            string strOut;
            //请求实时数据
            /*实时行情函数的格式为THS_RealtimeQuotes('thsCodes','indicators','params')
             * thsCodes不可以为空,且支持多个输入,当有多个thsCodes则用英文半角逗号分隔,如thsCode1,thsCode2,thsCode3
             * indicators不可以为空,且支持多个输入,当有多个indicators则用英文半角分号分隔,如indicator1;indicator2;indicator3
             * params不可以为空
             * THS_RealtimeQuotes('thsCode1,thsCode2,thsCode3','indicator1;indicator2;indicator3','param1,param2,param3')
             */
            strOut = THS_RealtimeQuotes("600000.SH,300033.SZ", "open;close;new;avg;change;price;volume", "pricetype:2");
           // 实时行情函数
            Console.WriteLine("实时行情函数");
            Console.WriteLine(strOut);
        }

        static void HistoryQuotesSample()
        {
            string strout;
            //请求历史行情
            /*
             *通过历史行情函数获取同花顺(300033.SZ)从2016-08-23到2016-11-23的开高低收数据
             *历史行情函数格式为THS_HistoryQuotes('thsCodes','indicators','params','startDate','endDate')
             *thsCodes不可以为空,且支持多个输入,当有多个thsCodes则用英文半角逗号分隔,如thsCode1,thsCode2,thsCode3
             *indicators不可以为空,且支持多个输入,当有多个indicators则用英文半角分号分隔,如indicator1;indicator2;indicator3
             *params不可以为空,且支持多个输入,当使用默认的参数时可以使用'default'表示,当用户只对其中某个指标设定而其他参数保持默认时,只需要输入设定的参数即可,如'period:W'
             *startDate的日期输入格式为YYYY-MM-DD
             *endDate的日期输入格式为YYYY-MM-DD
             *THS_HistoryQuotes('thsCode1,thsCode2,thsCode3','indicator1;indicator2;indicator3','param1,param2,param3','startDate','endDate')
             */
            strout = THS_HistoryQuotes("300033.SZ,600000.SH", "open;high;low;close", "period:D,pricetype:1,rptcategory:0,fqdate:1900-01-01,hb:YSHB", "2016-11-09", "2016-12-08");
            //历史行情函数
            Console.WriteLine("历史行情函数");
            Console.WriteLine(strout);
        }

        static void BasicDataSample()
        {
            string strOut;
            //请求基础数据
            /*基础数据THS_BasicData('thsCodes','function','params');支持多证券单指标输入
             * thsCodes不可以为空,且支持多个输入,当有多个thsCodes则用英文半角逗号分隔,如thsCode1,thsCode2,thsCode3
             * function不可以为空,且当前只支持单个function,目前函数名称可以在【iFinD终端-工具-数据接口-指标函数查询工具】查看
             * params可以为空,也可以有多个,当有多个params时则用英文半角逗号分隔,如param1,param2,param3
             * THS_BasicData('thsCode1,thsCode2,thsCode3','function','param1,param2,param3')
             */
            strOut = THS_BasicData("600000.SH,300033.SZ", "ths_mgsyeps_jb_stock", "2016-09-30");
            //基础数据函数
            Console.WriteLine("基础数据函数");
            Console.WriteLine(strOut);
        }

        static void DateSequenceSample()
        {
            string strOut;
            //请求日期序列
            /*日期系列函数格式为THS_DateSequence('thsCodes','indicators','params','startDate','endDate')
             * thsCodes不可以为空,且支持多个输入,当有多个thsCodes则用英文半角逗号分隔,如thsCode1,thsCode2,thsCode3
             * indicators不可以为空,且支持多个输入,当有多个indicators则用英文半角分号分隔,如indicator1;indicator2;indicator3
             * params不可以为空,且支持多个输入,当使用默认的参数时可以使用'default'表示,当用户只对其中某个指标设定而其他参数保持默认时,只需要输入设定的参数即可,如'Interval:M'
             * startDate的日期输入格式为YYYY-MM-DD
             * endDate的日期输入格式为YYYY-MM-DD
             * 日期序列函数格式为THS_DateSequence('thsCode1,thsCode2,thsCode3','indicator1;indicator2;indicator3','param1,param2,param3','startDate','endDate')
             */
            strOut = THS_DateSequence("600000.SH,300033.SZ", "open;BBI=BBI_day1:4,BBI_day2:7,BBI_day3:13,BBI_day4:25;close=close_fq_type:101", "CPS:1,Interval:W,Fill:Previous,Days:Workdays", "2014-12-18 09:30:00", "2015-01-22 15:30:00");
            //日期序列函数
            Console.WriteLine("日期序列函数");
            Console.WriteLine(strOut);
        }

        static void DataPoolSample()
        {
            string strOut;
            //请求数据池
            /*
             * 数据池函数格式为THS_DataPool('modelName','inputParams','outputParams')
             * modelName不可以为空,且一次只能输入一个
             * inputParams用英文半角分号隔开,如inputParam1;inputParam2;inputParam3
             * outputParams用英文半角冒号赋值,用英文半角逗号分隔,Y表示该字段输出,N表示该字段不输出,如果不写则默认为Y,如outputParam1:Y,outputParam2:Y,outputParam3:N
             * THS_DataPool('modelName','inputParam1;inputParam2;inputParam3','outputParam1,outputParam2,outputParams3')
             * 【001005260】是板块ID,目前板块ID可以在【iFinD终端-工具-数据接口-板块ID查询工具】查看
             */
            strOut = THS_DataPool("block", "2016-12-19;001005260", "date:Y,security_name:Y,thscode:Y");
            //数据池函数
            Console.WriteLine("数据池函数");
            Console.WriteLine(strOut);

        }

        static void EDBQuerySample()
        {
            string strout;
            //请求EDB宏观经济数据
            /*EDB数据请求函数格式为THS_EDBQuery('indicatorIDs','startDate','endDate')
             * indicatorIDs不可以为空,支持多个ID输入。指标ID可以在【iFinD终端-工具-数据接口】中的指标ID查询工具查看
             * startDate的日期输入格式为YYYY-MM-DD
             * endDate的日期输入格式为YYYY-MM-DD
             */
            strout = THS_EDBQuery("M002945620", "2000-01-01", "2017-01-01");
            //EDB数据请求函数
            Console.WriteLine("EDB数据请求函数");
            Console.WriteLine(strout);
        }

        static void DataStatisticsSample()
        {
            string strout;
            //用户数据使用量查询函数
            /*
             * 数据使用量查询函数,用于用户查询自身账号的数据使用量,其中行情数据是15000万条/周,基础数据是500万条/周,EDB数据是500条/周;
             * 通过高频序列函数、历史行情函数和实时行情函数获取的数据统称为行情数据;
             * 通过基础数据函数、日期序列函数和数据池函数获取的数据统称为基础数据;
             * 通过EDB数据请求函数获取的数据统称为EDB数据。
             */
            strout = THS_DataStatistics();
            //数据使用量统计函数
            Console.WriteLine("数据使用量统计函数");
            Console.WriteLine(strout);
        }

        static void GetErrorInfoSample()
        {
            string strout;
            //错误代码信息查询
            /*错误信息查询函数,对于函数执行后的errorcode进行查询,了解错误信息
             * value的值不可以为空,并且value的值必须是枚举出的错误值
             */
            strout = THS_GetErrorInfo(-1);
            //错误信息查询函数
            Console.WriteLine("错误信息查询函数");
            Console.WriteLine(strout);
        }

        static void DateQuerySample()
        {
            string strout;
            //方便用户在其自定义的时间区间内查询交易所的交易日历
            /*
             * 交易日期/日历日期查询函数
             * 日期查询函数的格式是THS_DateQuery('exchange','dateType:value,period:value,dateFormat:value','startDate','endDate')
             * exchange不可以为空
             * dateType,period,dateFormat的值也不可以为空
             * startDate的日期输入格式为YYYY-MM-DD
             * endDate的日期输入格式为YYYY-MM-DD
             */
            strout = THS_DateQuery("SSE", "dateType:trade,period:D,dateFormat:0", "2016-07-21", "2017-08-21");
            //日期请求函数
            Console.WriteLine("日期请求函数");
            Console.WriteLine(strout);
        }

        static void DateOffsetSample()
        {
            string strout;
            //根据用户指定一个日期和偏移量查询到相应的交易日期
            /*
             * 根据指定日期和偏移量找到相应的日期
             * 日期偏移函数的格式是THS_DateQuery('exchange','dateType:value,period:value,dateFormat:value','date')
             * exchange不可以为空
             * dateType,period,dateFormat的值也不可以为空
             * date的日期输入格式为YYYY-MM-DD
             */
            strout = THS_DateOffset("SSE", "dateType:trade,period:W,offset:-10,dateFormat:0", "2017-08-21");
            //日期偏移函数
            Console.WriteLine("日期偏移函数");
            Console.WriteLine(strout);
        }

        static void DateCountSample()
        {
            string strout;
            //方便用户统一在其自定义的时间区间内查询交易日期的总数
            /*
             * 统计指定时间区间和日期类型中的日期数量
             * 日期查询函数的格式是THS_DateCount('exchange','dateType:value,period:value,dateFormat:value','startDate','endDate')
             * exchange不可以为空
             * dateType,period,dateFormat的值也不可以为空
             * startDate的日期输入格式为YYYY-MM-DD
             * endDate的日期输入格式为YYYY-MM-DD
             */
            strout = THS_DateCount("SSE", "dateType:trade,period:D,dateFormat:0", "2016-07-21", "2017-08-21");
            //日期统计函数
            Console.WriteLine("日期统计函数");
            Console.WriteLine(strout);
        }


/********************************************************************************************************************************************************************/

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int FT_ifinDLogin(string strUserName, string strPassWord, int nType);

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int FT_ifinDLogout();

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern IntPtr FTQueryTHS_SynDateCountC(string ExchangeCode, //交易所
                                                     string Param, //参数
                                                     string startDate, //函数需要的参数
                                                     string endDate,
                                                     out  char* pret
                                                     );


        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern IntPtr FTQueryTHS_SynDateOffsetC(string ExchangeCode, //交易所
                                                     string Param, //参数
                                                     string endDate,
                                                     out  char* pret
                                                     );


        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern IntPtr FTQueryTHS_SynDateQueryC(string ExchangeCode, //交易所
                                                     string Param, //参数
                                                     string startDate, //函数需要的参数
                                                     string endDate,
                                                     out  char* pret
                                                     );



        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern int FTQueryTHS_SynDataPoolC(string DataPoolName, //数据池
                                                     string jsonIndicator, //
                                                     string jsonParam, //函数需要的参数
                                                     out  char* pret
                                                     );



        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern int FTQueryTHS_SynDateSeriesC(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标及指标需要的参数
                                                     string jsonParam, //函数需要的参数
                                                     string begintime,
                                                     string endtime,
                                                     out  char* pret
                                                     );




        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern int FTQueryTHS_SynBasicDataC(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标
                                                     string jsonParam, //函数需要的参数
                                                     out  char* pret
                                                     );



        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern int FTQueryTHS_SynHisQuoteC(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标及指标需要的参数
                                                     string jsonParam, //函数需要的参数
                                                     string begintime,
                                                     string endtime,
                                                     out  char* pret
                                                     );

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
        unsafe public static extern int FTQueryTHS_SynRTByJsonC(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标及指标需要的参数
                                                     string jsonParam, //函数需要的参数
                                                     out  char* pret
                                                     );

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        unsafe public static extern int FTQueryTHS_SynHFQByJsonC(string THSCodes,
                                                      string jsonIndicator,
                                                      string jsonParam,
                                                      string begintime,
                                                      string endtime,
                                                      out  char* pret);

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        unsafe public static extern int FTQueryTHS_SynEDBQueryC(string jsonIndicator,                                                    
                                                      string begintime,
                                                      string endtime,
                                                      out  char* pret);

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        unsafe public static extern int FTQueryTHS_SynGetErrorInfoC(int errorcode,
                                                      out  char* pret);

        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        unsafe public static extern IntPtr FTQuery_SynDataStasticsC(out int errorcode, void* reserve1, void* reserve2, void* reserve3);



        [DllImport(strDllFile, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        unsafe public static extern void DeleteBuffer(char* pret);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//封装的函数命令  直接按照以下封装接口调用即可

        static int THS_iFinDLogin(string UserAcount, string Password)
        {
            int nRet = FT_ifinDLogin(UserAcount, Password, 0);
            return nRet;
        }

        static int THS_iFinDLogout()
        {
            int nRet = FT_ifinDLogout();
            return nRet;
        }

        unsafe static string THS_HighFrequenceSequence(string THSCodes,
                                                      string jsonIndicator,
                                                      string jsonParam,
                                                      string begintime,
                                                      string endtime)//高频序列新版接口
          {
            string strOut;
            char* Pret;
            FTQueryTHS_SynHFQByJsonC(THSCodes, jsonIndicator, jsonParam, begintime, endtime, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_RealtimeQuotes(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标及指标需要的参数
                                                     string jsonParam //函数需要的参数
                                                       )//实时行情新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynRTByJsonC(THSCodes, jsonIndicator, jsonParam, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_HistoryQuotes(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标及指标需要的参数
                                                     string jsonParam, //函数需要的参数
                                                     string begintime,
                                                     string endtime
                                                     )//历史行情新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynHisQuoteC(THSCodes, jsonIndicator, jsonParam, begintime, endtime, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_BasicData(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标
                                                     string jsonParam //函数需要的参数
                                                     )//基础数据新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynBasicDataC(THSCodes, jsonIndicator, jsonParam, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_DateSequence(string THSCodes, //同花顺代码
                                                     string jsonIndicator, //指标及指标需要的参数
                                                     string jsonParam, //函数需要的参数
                                                     string begintime,
                                                     string endtime)//日期序列新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynDateSeriesC(THSCodes, jsonIndicator, jsonParam, begintime, endtime, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_DataPool(string DataPoolName, //数据池
                                                     string jsonIndicator, //
                                                     string jsonParam //函数需要的参数
                                                     )//数据池新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynDataPoolC(DataPoolName, jsonIndicator, jsonParam, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_DateQuery(string ExchangeCode, //交易所
                                                     string Param, //参数
                                                     string startDate, //函数需要的参数
                                                     string endDate)//日期查询新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynDateQueryC(ExchangeCode, Param, startDate, endDate, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_DateOffset(string ExchangeCode, //交易所
                                                     string Param, //参数
                                                     string endDate)//日期便宜新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynDateOffsetC(ExchangeCode, Param, endDate, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_DateCount(string ExchangeCode, //交易所
                                                     string Param, //参数
                                                     string startDate, //函数需要的参数
                                                     string endDate)//日期数量新版接口
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynDateCountC(ExchangeCode, Param, startDate, endDate,  out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_EDBQuery(string jsonIndicator,
                                                      string begintime,
                                                      string endtime
                                                      )
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynEDBQueryC(jsonIndicator, begintime, endtime, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }

        unsafe static string THS_DataStatistics()
        {
            string strOut;
            int code;
            strOut = Marshal.PtrToStringUni(FTQuery_SynDataStasticsC(out code, null, null, null));
            return strOut;
        }

        unsafe static string THS_GetErrorInfo(int code)
        {
            string strOut;
            char* Pret;
            FTQueryTHS_SynGetErrorInfoC(code, out  Pret);
            IntPtr data = new IntPtr(Pret);
            strOut = Marshal.PtrToStringUni(data);
            DeleteBuffer(Pret);
            return strOut;
        }


    }
}
View Code
原文地址:https://www.cnblogs.com/shiningleo007/p/12574741.html