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); }
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); }
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); }
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); }
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); }
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); }
////////////// //以下工作是将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)); }
//////////// //计算平均值差. //大智慧公式语法: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); //返回第一个有效数据开始的位置 }
//////////// //计算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); //返回第一个有效数据开始的位置 }
//////////// //计算平均值. //大智慧公式语法: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);//返回第一个有效数据开始的位置 }