예제 #1
0
        float[] _GetFinData(ref CALCINFO_SHARP pCalcInfoSharp)
        {
            if (pCalcInfoSharp.m_pfFinData == 0)
            {
                return(null);
            }
            float[] fFinData = new float[37];//大智慧财务数据个数
            IntPtr  hHandle  = new IntPtr(pCalcInfoSharp.m_pfFinData);

            Marshal.Copy(hHandle, fFinData, 0, 37);
            return(fFinData);
        }
예제 #2
0
        int _SetResultData(ref CALCINFO_SHARP pCalcInfoSharp, float[] fResult)
        {
            //将计算结果回送到大智慧
            if (pCalcInfoSharp.m_pResultBuf == 0)
            {
                return(-1);
            }
            if (fResult == null || fResult.Length == 0)
            {
                return(-1);
            }
            IntPtr hHandle = new IntPtr(pCalcInfoSharp.m_pResultBuf);

            Marshal.Copy(fResult, 0, hHandle, fResult.Length);
            Marshal.Copy(hHandle, fResult, 0, fResult.Length);
            return(fResult.Length);
        }
예제 #3
0
        public Int32 SHOWFORMVAR(Int32 pCalcInfo)
        {
            if (pCalcInfo == 0)
            {
                return(-1);
            }
            IntPtr         hHandle        = new IntPtr(pCalcInfo);
            CALCINFO_SHARP pCalcInfoSharp = (CALCINFO_SHARP)Marshal.PtrToStructure(hHandle, typeof(CALCINFO_SHARP));

            if (pCalcInfoSharp.m_nNumData == 0)
            {
                return(-1);
            }
            if (m_pForm == null)
            {
                m_pForm = new Form1();
                m_pForm.Show();
            }
            if (m_pForm.IsClose())
            {
                return(-1);
            }
            string sStockCode = _GetStockCode(ref pCalcInfoSharp);

            if (m_pForm.IsRefreshData(sStockCode, pCalcInfoSharp.m_dataType, pCalcInfoSharp.m_nNumData))
            {
                if (m_pForm.GetShowType() == SHOW_TYPE.Tick)
                {
                    STKDATA[]   pStkData   = _GetStockData(ref pCalcInfoSharp);
                    STKDATAEx[] pStkDataEx = _GetStockDataEx(ref pCalcInfoSharp);
                    m_pForm.RefreshData(ref pStkData, ref pStkDataEx);
                }
                else if (m_pForm.GetShowType() == SHOW_TYPE.Fin)
                {
                    float[] pFinData = _GetFinData(ref pCalcInfoSharp);
                    m_pForm.RefreshData(ref pFinData);
                }
                else //if (m_pForm.GetShowType() == SHOW_TYPE.Time)
                {
                    STKDATA[] pStkData = _GetStockData(ref pCalcInfoSharp);
                    m_pForm.RefreshData(ref pStkData);
                }
            }
            return(-1);
        }
예제 #4
0
        STKDATAEx[] _GetStockDataEx(ref CALCINFO_SHARP pCalcInfoSharp)
        {
            if (pCalcInfoSharp.m_pDataEx == 0)
            {
                return(null);
            }
            IntPtr hHandle;

            STKDATAEx[] pStkDataEx = new STKDATAEx[pCalcInfoSharp.m_nNumData];
            int         i;

            for (i = 0; i < pCalcInfoSharp.m_nNumData; i++)
            {
                hHandle       = new IntPtr(pCalcInfoSharp.m_pDataEx + i * Marshal.SizeOf(typeof(STKDATAEx)));
                pStkDataEx[i] = (STKDATAEx)Marshal.PtrToStructure(hHandle, typeof(STKDATAEx));
            }
            return(pStkDataEx);
        }
예제 #5
0
        STKDATA[] _GetStockData(ref CALCINFO_SHARP pCalcInfoSharp)
        {
            //这是正常的数据,也就是固定时间间隔的数据,有开盘价,最高价等.
            //日线,周线,分时等都是这种数据
            if (pCalcInfoSharp.m_pData == 0)
            {
                return(null);
            }
            IntPtr hHandle;

            STKDATA[] pStkData = new STKDATA[pCalcInfoSharp.m_nNumData];
            int       i;

            for (i = 0; i < pCalcInfoSharp.m_nNumData; i++)
            {
                hHandle     = new IntPtr(pCalcInfoSharp.m_pData + i * Marshal.SizeOf(typeof(STKDATA)));
                pStkData[i] = (STKDATA)Marshal.PtrToStructure(hHandle, typeof(STKDATA));
            }
            return(pStkData);
        }
예제 #6
0
        float[][] _GetParam(ref CALCINFO_SHARP pCalcInfoSharp)
        {
            //返回4个参数
            IntPtr hHandle = new IntPtr(pCalcInfoSharp.m_strStkLabel);

            float[][] fParam = new float[4][];
            if (pCalcInfoSharp.m_pfParam1 != 0)
            {
                hHandle = new IntPtr(pCalcInfoSharp.m_pfParam1);
                if (pCalcInfoSharp.m_nParam1Start >= 0)
                {
                    fParam[0] = new float[pCalcInfoSharp.m_nNumData];
                    Marshal.Copy(hHandle, fParam[0], pCalcInfoSharp.m_nParam1Start, pCalcInfoSharp.m_nNumData - pCalcInfoSharp.m_nParam1Start);
                }
                else
                {
                    fParam[0] = new float[1];
                    Marshal.Copy(hHandle, fParam[0], 0, 1);
                }
            }
            if (pCalcInfoSharp.m_pfParam2 != 0)
            {
                fParam[1] = new float[1];
                hHandle   = new IntPtr(pCalcInfoSharp.m_pfParam2);
                Marshal.Copy(hHandle, fParam[1], 0, 1);
            }
            if (pCalcInfoSharp.m_pfParam3 != 0)
            {
                fParam[2] = new float[1];
                hHandle   = new IntPtr(pCalcInfoSharp.m_pfParam3);
                Marshal.Copy(hHandle, fParam[2], 0, 1);
            }
            if (pCalcInfoSharp.m_pfParam4 != 0)
            {
                fParam[3] = new float[1];
                hHandle   = new IntPtr(pCalcInfoSharp.m_pfParam4);
                Marshal.Copy(hHandle, fParam[3], 0, 1);
            }
            return(fParam);
        }
예제 #7
0
        //////////////
        //以下工作是将C++结构的指针拆解成C#的数据类型
        //有很多方法,这是其中一种.
        //也可以将拆解放在C++的DzhCLI.DLL中.
        string _GetStockCode(ref CALCINFO_SHARP pCalcInfoSharp)
        {
            //返回股票代码
            if (pCalcInfoSharp.m_strStkLabel == 0)
            {
                return("");
            }
            IntPtr hHandle = new IntPtr(pCalcInfoSharp.m_strStkLabel);

            byte[] bStockCode = new byte[12];
            Marshal.Copy(hHandle, bStockCode, 0, 10);
            int i;

            for (i = 0; i < 10; i++)
            {
                if (bStockCode[i] == 0)
                {
                    break;
                }
            }
            return(System.Text.Encoding.Default.GetString(bStockCode, 0, i));
        }
예제 #8
0
        ////////////
        //计算平均值差.
        //大智慧公式语法:p1:= "DzhCLI @ AVERAGEDIFFVAR"(5,12);//5日平均 - 12日平均
        public Int32 AVERAGEDIFFVAR(Int32 pCalcInfo)
        {
            if (pCalcInfo == 0)
            {
                return(-1);
            }
            IntPtr         hHandle        = new IntPtr(pCalcInfo);
            CALCINFO_SHARP pCalcInfoSharp = (CALCINFO_SHARP)Marshal.PtrToStructure(hHandle, typeof(CALCINFO_SHARP));

            if (pCalcInfoSharp.m_nNumData == 0)
            {
                return(-1);
            }
            //4个参数
            float[][] fParam = _GetParam(ref pCalcInfoSharp);
            Int32     nAverageNumber1 = 1, nAverageNumber2 = 1;

            if (fParam[0] != null)//第一个平均数由第一个参数传入
            {
                nAverageNumber1 = (Int32)fParam[0][0];
            }
            if (nAverageNumber1 <= 0)
            {
                nAverageNumber1 = 1;
            }
            if (nAverageNumber1 > pCalcInfoSharp.m_nNumData)
            {
                return(-1);
            }

            if (fParam[1] != null)//第二个平均数由第二个参数传入
            {
                nAverageNumber2 = (Int32)fParam[1][0];
            }
            if (nAverageNumber2 <= 0)
            {
                nAverageNumber2 = 1;
            }
            if (nAverageNumber2 > pCalcInfoSharp.m_nNumData)
            {
                return(-1);
            }
            if (nAverageNumber1 == nAverageNumber2)
            {
                return(-1);
            }

            float[] fResult = new float[pCalcInfoSharp.m_nNumData];
            if (pCalcInfoSharp.m_dataType == (Int32)DATA_TYPE.TICK_DATA)
            {
                //分笔数据,这里的样本对买一价格平均
                //STKDATAEx里大智慧的这些数据是不对的.已经修改
                //在C++DLL里监视也是不对的.
                STKDATAEx[] pStkDataEx = _GetStockDataEx(ref pCalcInfoSharp);
                if (pStkDataEx == null)
                {
                    return(-1);
                }
                int   i, j;
                float f1, f2;
                if (nAverageNumber1 > nAverageNumber2)
                {
                    i = nAverageNumber1 - 1;
                }
                else
                {
                    i = nAverageNumber2 - 1;
                }
                for (; i < pCalcInfoSharp.m_nNumData; i++)
                {
                    f1 = 0;
                    f2 = 0;
                    for (j = 0; j < nAverageNumber1; j++)
                    {
                        f1 += pStkDataEx[i - j].m_fBuyPrice1;
                    }
                    f1 /= (float)nAverageNumber1;
                    for (j = 0; j < nAverageNumber2; j++)
                    {
                        f2 += pStkDataEx[i - j].m_fBuyPrice1;
                    }
                    f2        /= (float)nAverageNumber2;
                    fResult[i] = f1 - f2;
                }
            }
            else
            {
                //时间序列数据,这里的样本对收盘价平均
                STKDATA[] pStkData = _GetStockData(ref pCalcInfoSharp);
                if (pStkData == null)
                {
                    return(-1);
                }
                int   i, j;
                float f1, f2;
                if (nAverageNumber1 > nAverageNumber2)
                {
                    i = nAverageNumber1 - 1;
                }
                else
                {
                    i = nAverageNumber2 - 1;
                }
                for (; i < pCalcInfoSharp.m_nNumData; i++)
                {
                    f1 = 0;
                    f2 = 0;
                    for (j = 0; j < nAverageNumber1; j++)
                    {
                        f1 += pStkData[i - j].m_fClose;
                    }
                    f1 /= (float)nAverageNumber1;
                    for (j = 0; j < nAverageNumber2; j++)
                    {
                        f2 += pStkData[i - j].m_fClose;
                    }
                    f2        /= (float)nAverageNumber2;
                    fResult[i] = f1 - f2;
                }
            }
            _SetResultData(ref pCalcInfoSharp, fResult);
            if (nAverageNumber1 > nAverageNumber2)
            {
                return(nAverageNumber1 - 1); //返回第一个有效数据开始的位置
            }
            return(nAverageNumber2 - 1);     //返回第一个有效数据开始的位置
        }
예제 #9
0
        ////////////
        //计算MACD.
        //大智慧公式语法:p1:= "DzhCLI @ MACDVAR"(12,26,9);//12日平均 - 26日平均,对差值再做成9天平均
        //这个算法与大智慧自带的数值不一样,形状类似,不知道是否与EMA算法有关.
        //演示性质,不推敲细节了
        public Int32 MACDVAR(Int32 pCalcInfo)
        {
            if (pCalcInfo == 0)
            {
                return(-1);
            }
            IntPtr         hHandle        = new IntPtr(pCalcInfo);
            CALCINFO_SHARP pCalcInfoSharp = (CALCINFO_SHARP)Marshal.PtrToStructure(hHandle, typeof(CALCINFO_SHARP));

            if (pCalcInfoSharp.m_nNumData == 0)
            {
                return(-1);
            }
            //4个参数
            float[][] fParam = _GetParam(ref pCalcInfoSharp);
            Int32     nAverageNumber1 = 1, nAverageNumber2 = 1, nAverageNumber3 = 1;;

            if (fParam[0] != null)//第一个平均数由第一个参数传入
            {
                nAverageNumber1 = (Int32)fParam[0][0];
            }
            if (nAverageNumber1 <= 0)
            {
                nAverageNumber1 = 1;
            }

            if (fParam[1] != null)//第二个平均数由第二个参数传入
            {
                nAverageNumber2 = (Int32)fParam[1][0];
            }
            if (nAverageNumber2 <= 0)
            {
                nAverageNumber2 = 1;
            }

            if (fParam[2] != null)//第三个平均数由第三个参数传入
            {
                nAverageNumber3 = (Int32)fParam[1][0];
            }
            if (nAverageNumber3 <= 0)
            {
                nAverageNumber3 = 1;
            }

            if (nAverageNumber1 == nAverageNumber2)
            {
                return(-1);
            }
            if ((nAverageNumber1 + nAverageNumber3) > pCalcInfoSharp.m_nNumData)
            {
                return(-1);
            }
            if ((nAverageNumber1 + nAverageNumber3) > pCalcInfoSharp.m_nNumData)
            {
                return(-1);
            }

            float[] fResult = new float[pCalcInfoSharp.m_nNumData];
            float[] fMacd   = new float[pCalcInfoSharp.m_nNumData];
            //时间序列数据,这里的样本对收盘价平均
            STKDATA[] pStkData = _GetStockData(ref pCalcInfoSharp);
            if (pStkData == null)
            {
                return(-1);
            }
            int   i, j;
            float f1, f2;

            if (nAverageNumber1 > nAverageNumber2)
            {
                i = nAverageNumber1 - 1;
            }
            else
            {
                i = nAverageNumber2 - 1;
            }
            for (; i < pCalcInfoSharp.m_nNumData; i++)
            {
                f1 = 0;
                f2 = 0;
                for (j = 0; j < nAverageNumber1; j++)
                {
                    f1 += pStkData[i - j].m_fClose;
                }
                f1 /= (float)nAverageNumber1;
                for (j = 0; j < nAverageNumber2; j++)
                {
                    f2 += pStkData[i - j].m_fClose;
                }
                f2        /= (float)nAverageNumber2;
                fResult[i] = f1 - f2;
            }
            if (nAverageNumber1 > nAverageNumber2)
            {
                i = nAverageNumber1 + nAverageNumber3 - 1;
            }
            else
            {
                i = nAverageNumber2 + nAverageNumber3 - 1;
            }
            for (; i < pCalcInfoSharp.m_nNumData; i++)
            {
                f1 = 0;
                for (j = 0; j < nAverageNumber3; j++)
                {
                    fMacd[i] += fResult[i - j];
                }
                fMacd[i] /= (float)nAverageNumber3;
            }
            for (i = 0; i < pCalcInfoSharp.m_nNumData; i++)
            {
                fMacd[i] = fResult[i] - fMacd[i];
            }

            _SetResultData(ref pCalcInfoSharp, fMacd);
            if (nAverageNumber1 > nAverageNumber2)
            {
                return(nAverageNumber1 + nAverageNumber3 - 1); //返回第一个有效数据开始的位置
            }
            return(nAverageNumber2 + nAverageNumber3 - 1);     //返回第一个有效数据开始的位置
        }
예제 #10
0
        ////////////
        //计算平均值.
        //大智慧公式语法:p1:= "DzhCLI @ AVERAGEVAR"(5);//5日平均
        public Int32 AVERAGEVAR(Int32 pCalcInfo)
        {
            if (pCalcInfo == 0)
            {
                return(-1);
            }
            IntPtr         hHandle        = new IntPtr(pCalcInfo);
            CALCINFO_SHARP pCalcInfoSharp = (CALCINFO_SHARP)Marshal.PtrToStructure(hHandle, typeof(CALCINFO_SHARP));

            if (pCalcInfoSharp.m_nNumData == 0)
            {
                return(-1);
            }
            //4个参数
            float[][] fParam         = _GetParam(ref pCalcInfoSharp);
            Int32     nAverageNumber = 1;

            if (fParam[0] != null)//平均天数由第一个参数传入
            {
                nAverageNumber = (Int32)fParam[0][0];
            }
            if (nAverageNumber <= 0)
            {
                nAverageNumber = 1;
            }
            if (nAverageNumber > pCalcInfoSharp.m_nNumData)
            {
                return(-1);
            }
            float[] fResult = new float[pCalcInfoSharp.m_nNumData];
            if (pCalcInfoSharp.m_dataType == (Int32)DATA_TYPE.TICK_DATA)
            {
                //分笔数据,这里的样本对买一价格平均
                //STKDATAEx里大智慧的这些数据是不对的.已经修改
                //在C++DLL里监视也是不对的.
                STKDATAEx[] pStkDataEx = _GetStockDataEx(ref pCalcInfoSharp);
                if (pStkDataEx == null)
                {
                    return(-1);
                }
                int i, j;
                for (i = nAverageNumber - 1; i < pCalcInfoSharp.m_nNumData; i++)
                {
                    fResult[i] = 0;
                    for (j = 0; j < nAverageNumber; j++)
                    {
                        fResult[i] += pStkDataEx[i - j].m_fBuyPrice1;
                    }
                    fResult[i] = fResult[i] / (float)nAverageNumber;
                }
            }
            else
            {
                //时间序列数据,这里的样本对收盘价平均
                STKDATA[] pStkData = _GetStockData(ref pCalcInfoSharp);
                if (pStkData == null)
                {
                    return(-1);
                }
                int i, j;
                for (i = nAverageNumber - 1; i < pCalcInfoSharp.m_nNumData; i++)
                {
                    fResult[i] = 0;
                    for (j = 0; j < nAverageNumber; j++)
                    {
                        fResult[i] += pStkData[i - j].m_fClose;
                    }
                    fResult[i] = fResult[i] / (float)nAverageNumber;
                }
            }
            _SetResultData(ref pCalcInfoSharp, fResult);
            return(nAverageNumber - 1);//返回第一个有效数据开始的位置
        }