public static bool TryLoadMsflPriceInfo( string stockName, string stockSymbol, string strFilePath, out MSFL.MSFLPriceRecord[] msflPriceRecordArray ) { msflPriceRecordArray = new MSFL.MSFLPriceRecord[0]; if ( Directory.Exists( strFilePath ) == false ) return false; byte dirNumber = 0; int iErr = MSFL.MSFL1_OpenDirectory( strFilePath, ref dirNumber, MSFL.MSFL_DIR_FORCE_USER_IN ); if ( iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR ) return false; MSFL.MSFLDirectoryStatus msflDirectoryStatus = new MSFL.MSFLDirectoryStatus(); msflDirectoryStatus.dwTotalSize = (uint)Marshal.SizeOf( msflDirectoryStatus ); iErr = MSFL.MSFL1_GetDirectoryStatus( dirNumber, string.Empty, ref msflDirectoryStatus ); if ( iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR ) return false; if ( msflDirectoryStatus.bExists == false || msflDirectoryStatus.bOpen == false || msflDirectoryStatus.bMetaStockDir == false ) return false; MSFL.MSFLSecurityInfo msflSecurityInfo = new MSFL.MSFLSecurityInfo(); msflSecurityInfo.dwTotalSize = (uint)Marshal.SizeOf( msflSecurityInfo ); iErr = MSFL.MSFL1_GetFirstSecurityInfo( dirNumber, ref msflSecurityInfo ); while ( iErr == (int)MSFL.MSFL_ERR.MSFL_NO_ERR || iErr == (int)MSFL.MSFL_Messages.MSFL_MSG_LAST_SECURITY_IN_DIR ) { if ( msflSecurityInfo.szName == stockName && msflSecurityInfo.szSymbol == stockSymbol ) { iErr = MSFL.MSFL1_LockSecurity( msflSecurityInfo.hSecurity, MSFL.MSFL_LOCK_PREV_WRITE_LOCK ); if ( iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR ) break; ushort wPriceRecCount = 0; iErr = MSFL.MSFL1_GetDataRecordCount( msflSecurityInfo.hSecurity, ref wPriceRecCount ); if ( iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR ) break; if ( wPriceRecCount > 0 ) { iErr = MSFL.MSFL1_SeekBeginData( msflSecurityInfo.hSecurity ); if ( iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR ) break; MSFL.DateTime sDateTime = new MSFL.DateTime(); msflPriceRecordArray = new MSFL.MSFLPriceRecord[wPriceRecCount]; iErr = MSFL.MSFL2_ReadMultipleRecs( msflSecurityInfo.hSecurity, msflPriceRecordArray, ref sDateTime, ref wPriceRecCount, (int)MSFL.MSFL_FIND.MSFL_FIND_USE_CURRENT_POS ); if ( iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR ) break; // Unlock the security (we're done using it) iErr = MSFL.MSFL1_UnlockSecurity( msflSecurityInfo.hSecurity ); iErr = MSFL.MSFL1_CloseDirectory( dirNumber ); return true; } break; } if ( iErr == (int)MSFL.MSFL_Messages.MSFL_MSG_LAST_SECURITY_IN_DIR ) break; iErr = MSFL.MSFL1_GetNextSecurityInfo( msflSecurityInfo.hSecurity, ref msflSecurityInfo ); } MSFL.MSFL1_CloseDirectory( dirNumber ); return false; }
public static SRReport ScanSRStaticData( StockFileInfo stockFileInfo, LHPPrimaryScanInfo lhpScanInfo ) { MSFL.MSFLPriceRecord[] msflPriceRecordArray = new MSFL.MSFLPriceRecord[0]; if ( GlobalSetting.TryLoadMsflPriceInfo( stockFileInfo.StockName, stockFileInfo.StockSymbol, stockFileInfo.StockFilePath, out msflPriceRecordArray ) == false ) return null; if (msflPriceRecordArray.Length <= 0) return null; // 开始获取静态数据 SRStaticData srStaticData = new SRStaticData(); // 获取最新的股票数据 SRStaticData.StockData stockData = new SRStaticData.StockData(); stockData.StockDate = MSFL.FormatDate( msflPriceRecordArray[msflPriceRecordArray.Length - 1].lDate ); stockData.StockOpen = MSFL.FormatPrice( msflPriceRecordArray[msflPriceRecordArray.Length - 1].fOpen ); stockData.StockClose = MSFL.FormatPrice( msflPriceRecordArray[msflPriceRecordArray.Length - 1].fClose ); stockData.StockHigh = MSFL.FormatPrice( msflPriceRecordArray[msflPriceRecordArray.Length - 1].fHigh ); stockData.StockLow = MSFL.FormatPrice( msflPriceRecordArray[msflPriceRecordArray.Length - 1].fLow ); stockData.StockVolume = MSFL.FormatVolume( msflPriceRecordArray[msflPriceRecordArray.Length - 1].fVolume ); // 初始化静态数据 srStaticData.StockName = stockFileInfo.StockName; srStaticData.StockSymbol = stockFileInfo.StockSymbol; srStaticData.LastStock = stockData; //Debug.WriteLine( "*********************************************************************************" ); //Debug.WriteLine( "Stock Name = " + srStaticData.StockName ); //Debug.WriteLine( "Stock Symbol = " + srStaticData.StockSymbol ); //Debug.WriteLine( string.Empty ); //Debug.WriteLine( "---------------------------------------------------------------------------------"); //Debug.WriteLine( "LastStock = " ); //Debug.WriteLine( " Stock Date = " + srStaticData.LastStock.StockDate.ToShortDateString() ); //Debug.WriteLine( " Stock Open = " + srStaticData.LastStock.StockOpen.ToString() ); //Debug.WriteLine( " Stock Close = " + srStaticData.LastStock.StockClose.ToString() ); //Debug.WriteLine( " Stock High = " + srStaticData.LastStock.StockHigh.ToString() ); //Debug.WriteLine( " Stock Low = " + srStaticData.LastStock.StockLow.ToString() ); //Debug.WriteLine( " Stock Volume = " + srStaticData.LastStock.StockVolume.ToString() ); //Debug.WriteLine( "---------------------------------------------------------------------------------" ); //Debug.WriteLine( string.Empty ); int iScanSpace = lhpScanInfo.m_ScanBaseInfo.ScanSpace > 0 ? lhpScanInfo.m_ScanBaseInfo.ScanSpace : int.MaxValue; List<SRStaticData.SRStaticInfo> listStaticInfo = new List<SRStaticData.SRStaticInfo>(); for ( int iIndex = msflPriceRecordArray.Length - 2, iIndexQQQ = 0; iIndex >= 0 && iIndexQQQ < iScanSpace; iIndex--, iIndexQQQ++ ) { MSFL.MSFLPriceRecord msflPriceRecord = msflPriceRecordArray[iIndex]; DateTime stockDate = MSFL.FormatDate( msflPriceRecord.lDate ); float fHigh = MSFL.FormatPrice( msflPriceRecord.fHigh ); float fLow = MSFL.FormatPrice( msflPriceRecord.fLow ); float fOpen = MSFL.FormatPrice( msflPriceRecord.fOpen ); float fClose = MSFL.FormatPrice( msflPriceRecord.fClose ); float fVolume = MSFL.FormatPrice( msflPriceRecord.fVolume ); SRStaticData.SRStaticInfo staticInfo = new SRStaticData.SRStaticInfo(); if ( lhpScanInfo.m_ScanBaseInfo.AllowScanGapUp == true && lhpScanInfo.m_ScanBaseInfo.AllowGULK == true && GlobalSetting.IsGULK( iIndex, msflPriceRecordArray ) == true ) { float fHKLow = MSFL.FormatPrice( msflPriceRecordArray[iIndex + 1].fLow ); if ( ( ( fHKLow - fHigh ) / fHigh * 100 ) >= lhpScanInfo.m_ScanBaseInfo.GapUpPercentum ) { staticInfo.SRPointType |= SRStaticData.SRPointType.GULK; float fEntity = fOpen > fClose ? fOpen : fClose; staticInfo.GapPercentum = ( fLow - fHigh ) / fEntity; staticInfo.StockAverageHigh = MSFL.FormatPrice( fEntity + ( fHigh - fEntity ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftHigh = MSFL.FormatPrice( msflPriceRecordLeft.fHigh ); if ( fLeftHigh < fHigh ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightHigh = MSFL.FormatPrice( msflPriceRecordRight.fHigh ); if ( fRightHigh < fHigh ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fHigh > srStaticData.MaxDCHP ) srStaticData.MaxDCHP = fHigh; } } if ( lhpScanInfo.m_ScanBaseInfo.AllowScanGapUp == true && lhpScanInfo.m_ScanBaseInfo.AllowGUHK == true && GlobalSetting.IsGUHK( iIndex, msflPriceRecordArray ) == true ) { float fLKHigh = MSFL.FormatPrice( msflPriceRecordArray[iIndex - 1].fHigh ); if ( ( ( fLow - fLKHigh ) / fLKHigh * 100 ) >= lhpScanInfo.m_ScanBaseInfo.GapUpPercentum ) { staticInfo.SRPointType |= SRStaticData.SRPointType.GUHK; float fAverageGapVolume = 0; for ( int i2 = iIndex, k = 0; i2 >= 0 && k < 20; i2--, k++ ) { float gapVolume = MSFL.FormatVolume( msflPriceRecordArray[i2].fVolume ); fAverageGapVolume += gapVolume; } fAverageGapVolume = fAverageGapVolume / 20; staticInfo.GapVolumePercentum = MSFL.FormatVolume( ( ( fVolume - fAverageGapVolume ) / fAverageGapVolume ) * 100 ); float fLKOpen = MSFL.FormatPrice( msflPriceRecordArray[iIndex - 1].fOpen ); float fLKClose = MSFL.FormatPrice( msflPriceRecordArray[iIndex - 1].fClose ); float fLKEntity = fLKOpen > fLKClose ? fLKOpen : fLKClose; float fEntity = fOpen < fClose ? fOpen : fClose; staticInfo.GapPercentum = ( fLow - fLKHigh ) / fLKEntity; staticInfo.GapPriceSpace = MSFL.FormatPrice( ( ( fLow - fLKHigh ) / fLKHigh * 100 ) ); staticInfo.StockAverageLow = MSFL.FormatPrice( fLow + ( fEntity - fLow ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftLow = MSFL.FormatPrice( msflPriceRecordLeft.fLow ); if ( fLeftLow > fLow ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightLow = MSFL.FormatPrice( msflPriceRecordRight.fLow ); if ( fRightLow > fLow ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fLow < srStaticData.MinDCLP ) srStaticData.MinDCLP = fLow; } } if ( lhpScanInfo.m_ScanBaseInfo.AllowScanGapDown == true && lhpScanInfo.m_ScanBaseInfo.AllowGDLK == true && GlobalSetting.IsGDLK( iIndex, msflPriceRecordArray ) == true ) { float fHKLow = MSFL.FormatPrice( msflPriceRecordArray[iIndex - 1].fLow ); if ( ( ( fHKLow - fHigh ) / fHigh * 100 ) >= lhpScanInfo.m_ScanBaseInfo.GapDownPercentum ) { staticInfo.SRPointType |= SRStaticData.SRPointType.GDLK; float fAverageGapVolume = 0; for ( int i2 = iIndex, k = 0; i2 >= 0 && k < 20; i2--, k++ ) { float gapVolume = MSFL.FormatVolume( msflPriceRecordArray[i2].fVolume ); fAverageGapVolume += gapVolume; } fAverageGapVolume = fAverageGapVolume / 20; staticInfo.GapVolumePercentum = MSFL.FormatVolume( ( ( fVolume - fAverageGapVolume ) / fAverageGapVolume ) * 100 ); float fHKOpen = MSFL.FormatPrice( msflPriceRecordArray[iIndex - 1].fOpen ); float fHKClose = MSFL.FormatPrice( msflPriceRecordArray[iIndex - 1].fClose ); float fHKEntity = fHKOpen < fHKClose ? fHKOpen : fHKClose; float fEntity = fOpen > fClose ? fOpen : fClose; staticInfo.GapPercentum = ( fHKLow - fHigh ) / fHKEntity; staticInfo.GapPriceSpace = MSFL.FormatPrice( ( ( fHKLow - fHigh ) / fHigh * 100 ) ); staticInfo.StockAverageHigh = MSFL.FormatPrice( fEntity + ( fHigh - fEntity ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftHigh = MSFL.FormatPrice( msflPriceRecordLeft.fHigh ); if ( fLeftHigh < fHigh ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightHigh = MSFL.FormatPrice( msflPriceRecordRight.fHigh ); if ( fRightHigh < fHigh ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fHigh > srStaticData.MaxDCHP ) srStaticData.MaxDCHP = fHigh; } } if ( lhpScanInfo.m_ScanBaseInfo.AllowScanGapDown == true && lhpScanInfo.m_ScanBaseInfo.AllowGDHK == true && GlobalSetting.IsGDHK( iIndex, msflPriceRecordArray ) == true ) { float fLKHigh = MSFL.FormatPrice( msflPriceRecordArray[iIndex + 1].fHigh ); if ( ( ( fLow - fLKHigh ) / fLKHigh * 100 ) >= lhpScanInfo.m_ScanBaseInfo.GapDownPercentum ) { staticInfo.SRPointType |= SRStaticData.SRPointType.GDHK; float fEntity = fOpen < fClose ? fOpen : fClose; staticInfo.GapPercentum = ( fLow - fLKHigh ) / fEntity; staticInfo.StockAverageLow = MSFL.FormatPrice( fLow + ( fEntity - fLow ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftLow = MSFL.FormatPrice( msflPriceRecordLeft.fLow ); if ( fLeftLow > fLow ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightLow = MSFL.FormatPrice( msflPriceRecordRight.fLow ); if ( fRightLow > fLow ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fLow < srStaticData.MinDCLP ) srStaticData.MinDCLP = fLow; } } if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCLP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCLP313 == true && GlobalSetting.IsDCLP_313( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType = SRStaticData.SRPointType.DCLP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_313; float fEntity = fOpen < fClose ? fOpen : fClose; staticInfo.StockAverageLow = MSFL.FormatPrice( fLow + ( fEntity - fLow ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftLow = MSFL.FormatPrice( msflPriceRecordLeft.fLow ); if ( fLeftLow > fLow ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightLow = MSFL.FormatPrice( msflPriceRecordRight.fLow ); if ( fRightLow > fLow ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fLow < srStaticData.MinDCLP ) srStaticData.MinDCLP = fLow; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCLP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCLP214 == true && GlobalSetting.IsDCLP_214( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCLP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_214; float fEntity = fOpen < fClose ? fOpen : fClose; staticInfo.StockAverageLow = MSFL.FormatPrice( fLow + ( fEntity - fLow ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftLow = MSFL.FormatPrice( msflPriceRecordLeft.fLow ); if ( fLeftLow > fLow ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightLow = MSFL.FormatPrice( msflPriceRecordRight.fLow ); if ( fRightLow > fLow ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fLow < srStaticData.MinDCLP ) srStaticData.MinDCLP = fLow; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCLP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCLP115 == true && GlobalSetting.IsDCLP_115( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCLP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_115; float fEntity = fOpen < fClose ? fOpen : fClose; staticInfo.StockAverageLow = MSFL.FormatPrice( fLow + ( fEntity - fLow ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftLow = MSFL.FormatPrice( msflPriceRecordLeft.fLow ); if ( fLeftLow > fLow ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightLow = MSFL.FormatPrice( msflPriceRecordRight.fLow ); if ( fRightLow > fLow ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fLow < srStaticData.MinDCLP ) srStaticData.MinDCLP = fLow; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCLP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCLP412 == true && GlobalSetting.IsDCLP_412( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCLP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_412; float fEntity = fOpen < fClose ? fOpen : fClose; staticInfo.StockAverageLow = MSFL.FormatPrice( fLow + ( fEntity - fLow ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftLow = MSFL.FormatPrice( msflPriceRecordLeft.fLow ); if ( fLeftLow > fLow ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightLow = MSFL.FormatPrice( msflPriceRecordRight.fLow ); if ( fRightLow > fLow ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fLow < srStaticData.MinDCLP ) srStaticData.MinDCLP = fLow; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCLP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCLP511 == true && GlobalSetting.IsDCLP_511( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCLP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_511; float fEntity = fOpen < fClose ? fOpen : fClose; staticInfo.StockAverageLow = MSFL.FormatPrice( fLow + ( fEntity - fLow ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftLow = MSFL.FormatPrice( msflPriceRecordLeft.fLow ); if ( fLeftLow > fLow ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightLow = MSFL.FormatPrice( msflPriceRecordRight.fLow ); if ( fRightLow > fLow ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fLow < srStaticData.MinDCLP ) srStaticData.MinDCLP = fLow; } if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCHP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCHP313 == true && GlobalSetting.IsDCHP_313( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCHP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_313; float fEntity = fOpen > fClose ? fOpen : fClose; staticInfo.StockAverageHigh = MSFL.FormatPrice( fEntity + ( fHigh - fEntity ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftHigh = MSFL.FormatPrice( msflPriceRecordLeft.fHigh ); if ( fLeftHigh < fHigh ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightHigh = MSFL.FormatPrice( msflPriceRecordRight.fHigh ); if ( fRightHigh < fHigh ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fHigh > srStaticData.MaxDCHP ) srStaticData.MaxDCHP = fHigh; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCHP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCHP214 == true && GlobalSetting.IsDCHP_214( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCHP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_214; float fEntity = fOpen > fClose ? fOpen : fClose; staticInfo.StockAverageHigh = MSFL.FormatPrice( fEntity + ( fHigh - fEntity ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftHigh = MSFL.FormatPrice( msflPriceRecordLeft.fHigh ); if ( fLeftHigh < fHigh ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightHigh = MSFL.FormatPrice( msflPriceRecordRight.fHigh ); if ( fRightHigh < fHigh ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fHigh > srStaticData.MaxDCHP ) srStaticData.MaxDCHP = fHigh; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCHP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCHP115 == true && GlobalSetting.IsDCHP_115( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCHP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_115; float fEntity = fOpen > fClose ? fOpen : fClose; staticInfo.StockAverageHigh = MSFL.FormatPrice( fEntity + ( fHigh - fEntity ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftHigh = MSFL.FormatPrice( msflPriceRecordLeft.fHigh ); if ( fLeftHigh < fHigh ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightHigh = MSFL.FormatPrice( msflPriceRecordRight.fHigh ); if ( fRightHigh < fHigh ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fHigh > srStaticData.MaxDCHP ) srStaticData.MaxDCHP = fHigh; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCHP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCHP412 == true && GlobalSetting.IsDCHP_412( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCHP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_412; float fEntity = fOpen > fClose ? fOpen : fClose; staticInfo.StockAverageHigh = MSFL.FormatPrice( fEntity + ( fHigh - fEntity ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftHigh = MSFL.FormatPrice( msflPriceRecordLeft.fHigh ); if ( fLeftHigh < fHigh ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightHigh = MSFL.FormatPrice( msflPriceRecordRight.fHigh ); if ( fRightHigh < fHigh ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fHigh > srStaticData.MaxDCHP ) srStaticData.MaxDCHP = fHigh; } else if ( lhpScanInfo.m_ScanBaseInfo.AllowScanDCHP == true && lhpScanInfo.m_ScanBaseInfo.AllowDCHP511 == true && GlobalSetting.IsDCHP_511( iIndex, msflPriceRecordArray ) == true ) { staticInfo.SRPointType |= SRStaticData.SRPointType.DCHP; staticInfo.DCPointType = SRStaticData.DCPointType.DC_511; float fEntity = fOpen > fClose ? fOpen : fClose; staticInfo.StockAverageHigh = MSFL.FormatPrice( fEntity + ( fHigh - fEntity ) / 2 ); int iLeftCount = 0; for ( int iIndexLeft = iIndex - 1; iIndexLeft >= 0; iIndexLeft-- ) { MSFL.MSFLPriceRecord msflPriceRecordLeft = msflPriceRecordArray[iIndexLeft]; float fLeftHigh = MSFL.FormatPrice( msflPriceRecordLeft.fHigh ); if ( fLeftHigh < fHigh ) iLeftCount++; else break; } int iRightCount = 0; for ( int iIndexRight = iIndex + 1; iIndexRight < msflPriceRecordArray.Length; iIndexRight++ ) { MSFL.MSFLPriceRecord msflPriceRecordRight = msflPriceRecordArray[iIndexRight]; float fRightHigh = MSFL.FormatPrice( msflPriceRecordRight.fHigh ); if ( fRightHigh < fHigh ) iRightCount++; else break; } staticInfo.LeftKLineNumber = iLeftCount; staticInfo.RightLineNumber = iRightCount; if ( fHigh > srStaticData.MaxDCHP ) srStaticData.MaxDCHP = fHigh; } if ( staticInfo.SRPointType == SRStaticData.SRPointType.None ) continue; SRStaticData.StockData stockDataX = new SRStaticData.StockData(); stockDataX.StockDate = MSFL.FormatDate( msflPriceRecord.lDate ); stockDataX.StockOpen = MSFL.FormatPrice( msflPriceRecord.fOpen ); stockDataX.StockHigh = MSFL.FormatPrice( msflPriceRecord.fHigh ); stockDataX.StockLow = MSFL.FormatPrice( msflPriceRecord.fLow ); stockDataX.StockClose = MSFL.FormatPrice( msflPriceRecord.fClose ); stockDataX.StockVolume = MSFL.FormatVolume( msflPriceRecord.fVolume ); staticInfo.StockData = stockDataX; listStaticInfo.Add( staticInfo ); } srStaticData.srStaticInfoArray = listStaticInfo.ToArray(); List<SRStaticData.SRTrendInfo> listTrendInfo = new List<SRStaticData.SRTrendInfo>(); for ( int iIndex = 0; iIndex < ( srStaticData.srStaticInfoArray.Length - 1 ); iIndex++ ) { SRStaticData.SRStaticInfo srStaticInfoA = srStaticData.srStaticInfoArray[iIndex]; for ( int iIndex2 = iIndex + 1; iIndex2 < srStaticData.srStaticInfoArray.Length; iIndex2++ ) { SRStaticData.SRStaticInfo srStaticInfoB = srStaticData.srStaticInfoArray[iIndex2]; if ( srStaticInfoA.StockData.StockDate <= srStaticInfoB.StockData.StockDate ) continue; if ( ( (srStaticInfoA.SRPointType & SRStaticData.SRPointType.DCHP) == SRStaticData.SRPointType.DCHP || ( srStaticInfoA.SRPointType & SRStaticData.SRPointType.GULK ) == SRStaticData.SRPointType.GULK || ( srStaticInfoA.SRPointType & SRStaticData.SRPointType.GDLK ) == SRStaticData.SRPointType.GDLK ) && ( ( srStaticInfoB.SRPointType & SRStaticData.SRPointType.DCHP ) == SRStaticData.SRPointType.DCHP || ( srStaticInfoB.SRPointType & SRStaticData.SRPointType.GULK ) == SRStaticData.SRPointType.GULK || ( srStaticInfoB.SRPointType & SRStaticData.SRPointType.GDLK ) == SRStaticData.SRPointType.GDLK ) ) { if ( srStaticInfoA.StockData.StockHigh < srStaticInfoB.StockData.StockHigh ) { SRStaticData.SRTrendInfo srTrendInfo = new SRStaticData.SRTrendInfo(); srTrendInfo.SRStaticInfoA = srStaticInfoA; srTrendInfo.SRStaticInfoB = srStaticInfoB; srTrendInfo.TrendInfo = SRStaticData.TrendType.Down; srTrendInfo.GUID = Guid.NewGuid().ToString(); // listTrendInfo.Add( srTrendInfo ); } } else if ( ( ( srStaticInfoA.SRPointType & SRStaticData.SRPointType.DCLP ) == SRStaticData.SRPointType.DCLP || ( srStaticInfoA.SRPointType & SRStaticData.SRPointType.GUHK ) == SRStaticData.SRPointType.GUHK || ( srStaticInfoA.SRPointType & SRStaticData.SRPointType.GDHK ) == SRStaticData.SRPointType.GDHK ) && ( ( srStaticInfoB.SRPointType & SRStaticData.SRPointType.DCLP ) == SRStaticData.SRPointType.DCLP || ( srStaticInfoB.SRPointType & SRStaticData.SRPointType.GUHK ) == SRStaticData.SRPointType.GUHK || ( srStaticInfoB.SRPointType & SRStaticData.SRPointType.GDHK ) == SRStaticData.SRPointType.GDHK ) ) { if ( srStaticInfoA.StockData.StockLow > srStaticInfoB.StockData.StockLow ) { SRStaticData.SRTrendInfo srTrendInfo = new SRStaticData.SRTrendInfo(); srTrendInfo.SRStaticInfoA = srStaticInfoA; srTrendInfo.SRStaticInfoB = srStaticInfoB; srTrendInfo.TrendInfo = SRStaticData.TrendType.Up; srTrendInfo.GUID = Guid.NewGuid().ToString(); // listTrendInfo.Add( srTrendInfo ); } } else break; } } srStaticData.srTrendInfoArray = listTrendInfo.ToArray(); SetStaticRelativelyNumber( srStaticData ); SetTrendRelativelyNumber( srStaticData ); // 开始计算动态值 SRDynamicData srDynamicData = new SRDynamicData(); // 初始化动态值 srDynamicData.StockName = stockFileInfo.StockName; srDynamicData.StockSymbol = stockFileInfo.StockSymbol; for ( int i = ( msflPriceRecordArray.Length - 1 ); i >= 0; i-- ) { MSFL.MSFLPriceRecord msflPriceRecord = msflPriceRecordArray[i]; DateTime stockDate = MSFL.FormatDate( msflPriceRecord.lDate ); if ( lhpScanInfo.m_ScanNormalInfo.ScanDate >= stockDate ) { SRDynamicData.StockData stockDataCurrent = new SRDynamicData.StockData(); stockDataCurrent.StockDate = stockDate; stockDataCurrent.StockOpen = MSFL.FormatPrice( msflPriceRecord.fOpen ); stockDataCurrent.StockHigh = MSFL.FormatPrice( msflPriceRecord.fHigh ); stockDataCurrent.StockLow = MSFL.FormatPrice( msflPriceRecord.fLow ); stockDataCurrent.StockClose = MSFL.FormatPrice( msflPriceRecord.fClose ); stockDataCurrent.StockVolume = MSFL.FormatVolume( msflPriceRecord.fVolume ); // 初始化动态值当前的股票 srDynamicData.CurrentStock = stockDataCurrent; srDynamicData.StockCPF = MSFL.FormatPrice( stockDataCurrent.StockHigh - stockDataCurrent.StockLow ); srDynamicData.StockCRPF = MSFL.FormatPrice( srDynamicData.StockCPF / stockDataCurrent.StockClose ); if ( i > 1 ) { float fPerClose = MSFL.FormatPrice( msflPriceRecordArray[i - 1].fClose ); if ( fPerClose < stockDataCurrent.StockClose ) { srDynamicData.PriceFloat = MSFL.FormatPrice( ( stockDataCurrent.StockClose - fPerClose ) / stockDataCurrent.StockClose ); } else if ( fPerClose > stockDataCurrent.StockClose ) { srDynamicData.PriceFloat = MSFL.FormatPrice( -( ( fPerClose - stockDataCurrent.StockClose ) / stockDataCurrent.StockClose ) ); } else srDynamicData.PriceFloat = 0F; } float fAverageAPF = 0; float fAverageARPF = 0; for ( int i2 = i, k = 0; i2 >= 0 && k < 20; i2--, k++ ) { float fHigh = MSFL.FormatPrice( msflPriceRecordArray[i2].fHigh ); float fLow = MSFL.FormatPrice( msflPriceRecordArray[i2].fLow ); float fClose = MSFL.FormatPrice( msflPriceRecordArray[i2].fClose ); fAverageAPF += ( fHigh + fLow ); fAverageARPF += fAverageAPF / fClose; } srDynamicData.StockAPF = MSFL.FormatPrice( fAverageAPF / 20 ); srDynamicData.StockARPF = MSFL.FormatPrice( fAverageARPF / 20 ); List<SRDynamicData.TrendData> listTrendData = new List<SRDynamicData.TrendData>(); for ( int iIndex = 0; iIndex < ( srStaticData.srTrendInfoArray.Length - 1 ); iIndex++ ) { SRStaticData.SRTrendInfo srSRTrendInfo = srStaticData.srTrendInfoArray[iIndex]; SRDynamicData.TrendData trendData = new SRDynamicData.TrendData(); trendData.GUID = srSRTrendInfo.GUID; trendData.SRTrendInfo = srSRTrendInfo; trendData.CSR = 0; if ( srSRTrendInfo.SRStaticInfoA.StockData.StockDate >= stockDataCurrent.StockDate || srSRTrendInfo.SRStaticInfoB.StockData.StockDate >= stockDataCurrent.StockDate ) break; int iNumMin = 0; int iNumMax = 0; int iNum = 1; for ( int i6 = i; i6 >= 0; i6-- ) { MSFL.MSFLPriceRecord msflPriceRecordX = msflPriceRecordArray[i6]; DateTime stockDateX = MSFL.FormatDate( msflPriceRecordX.lDate ); if ( stockDateX == srSRTrendInfo.SRStaticInfoA.StockData.StockDate ) iNumMin = iNum; if ( stockDateX == srSRTrendInfo.SRStaticInfoB.StockData.StockDate ) iNumMax = iNum; iNum++; } if (srSRTrendInfo.TrendInfo == SRStaticData.TrendType.Down ) { float G = ( srSRTrendInfo.SRStaticInfoA.StockData.StockHigh - srSRTrendInfo.SRStaticInfoB.StockData.StockHigh ) / ( iNumMax - iNumMin ); float DTLP = srSRTrendInfo.SRStaticInfoA.StockData.StockHigh - G * ( iNumMax - 1 ); trendData.CSR = MSFL.FormatPrice( DTLP ); } else if (srSRTrendInfo.TrendInfo == SRStaticData.TrendType.Up) { float G = ( srSRTrendInfo.SRStaticInfoA.StockData.StockLow - srSRTrendInfo.SRStaticInfoB.StockData.StockLow ) / ( iNumMax - iNumMin ); float DTLP = srSRTrendInfo.SRStaticInfoA.StockData.StockLow - G * ( iNumMax - 1 ); trendData.CSR = MSFL.FormatPrice( DTLP ); } else break; listTrendData.Add( trendData ); } srDynamicData.srTrendDataArray = listTrendData.ToArray(); break; } } float fSRCK_R = float.MaxValue; float fSRCK_S = float.MinValue; for ( int iA = 0; iA < srStaticData.srStaticInfoArray.Length; iA++ ) { SRStaticData.SRStaticInfo SRStaticInfo = srStaticData.srStaticInfoArray[iA]; if ( ( SRStaticInfo.SRPointType & SRStaticData.SRPointType.DCHP ) == SRStaticData.SRPointType.DCHP ) { if ( SRStaticInfo.StockAverageHigh > srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageHigh < fSRCK_R ) fSRCK_R = SRStaticInfo.StockAverageHigh; } else if ( SRStaticInfo.StockAverageHigh < srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageHigh > fSRCK_S ) fSRCK_S = SRStaticInfo.StockAverageHigh; } } if ( ( SRStaticInfo.SRPointType & SRStaticData.SRPointType.DCLP ) == SRStaticData.SRPointType.DCLP ) { if ( SRStaticInfo.StockAverageLow > srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageLow < fSRCK_R ) fSRCK_R = SRStaticInfo.StockAverageLow; } else if ( SRStaticInfo.StockAverageLow < srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageLow > fSRCK_S ) fSRCK_S = SRStaticInfo.StockAverageLow; } } if ( ( SRStaticInfo.SRPointType & SRStaticData.SRPointType.GDHK ) == SRStaticData.SRPointType.GDHK ) { if ( SRStaticInfo.StockAverageLow > srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageLow < fSRCK_R ) fSRCK_R = SRStaticInfo.StockAverageLow; } else if ( SRStaticInfo.StockAverageLow < srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageLow > fSRCK_S ) fSRCK_S = SRStaticInfo.StockAverageLow; } } if ( ( SRStaticInfo.SRPointType & SRStaticData.SRPointType.GDLK ) == SRStaticData.SRPointType.GDLK ) { if ( SRStaticInfo.StockAverageHigh > srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageHigh < fSRCK_R ) fSRCK_R = SRStaticInfo.StockAverageHigh; } else if ( SRStaticInfo.StockAverageHigh < srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageHigh > fSRCK_S ) fSRCK_S = SRStaticInfo.StockAverageHigh; } } if ( ( SRStaticInfo.SRPointType & SRStaticData.SRPointType.GUHK ) == SRStaticData.SRPointType.GUHK ) { if ( SRStaticInfo.StockAverageLow > srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageLow < fSRCK_R ) fSRCK_R = SRStaticInfo.StockAverageLow; } else if ( SRStaticInfo.StockAverageLow < srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageLow > fSRCK_S ) fSRCK_S = SRStaticInfo.StockAverageLow; } } if ( ( SRStaticInfo.SRPointType & SRStaticData.SRPointType.GULK ) == SRStaticData.SRPointType.GULK ) { if ( SRStaticInfo.StockAverageHigh > srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageHigh < fSRCK_R ) fSRCK_R = SRStaticInfo.StockAverageHigh; } else if ( SRStaticInfo.StockAverageHigh < srDynamicData.CurrentStock.StockClose ) { if ( SRStaticInfo.StockAverageHigh > fSRCK_S ) fSRCK_S = SRStaticInfo.StockAverageHigh; } } } if ( fSRCK_R != float.MaxValue ) { MessageBox.Show( fSRCK_R.ToString() ); srDynamicData.StaticSRCK_R = MSFL.FormatPrice( ( ( fSRCK_R - srDynamicData.CurrentStock.StockClose ) / srDynamicData.CurrentStock.StockClose ) * 100 ); srDynamicData.StaticSRCK_RV = MSFL.FormatPrice( fSRCK_R ); } if ( fSRCK_S != float.MinValue ) { srDynamicData.StaticSRCK_S = MSFL.FormatPrice( ( ( srDynamicData.CurrentStock.StockClose - fSRCK_S ) / srDynamicData.CurrentStock.StockClose ) * 100 ); srDynamicData.StaticSRCK_SV = MSFL.FormatPrice( fSRCK_S ); } fSRCK_R = float.MaxValue; fSRCK_S = float.MinValue; for ( int i2 = 0; i2 < srDynamicData.srTrendDataArray.Length; i2++ ) { SRDynamicData.TrendData trendData = srDynamicData.srTrendDataArray[i2]; if ( trendData.CSR > srDynamicData.CurrentStock.StockClose ) { if ( trendData.CSR < fSRCK_R ) fSRCK_R = trendData.CSR; } else if ( trendData.CSR < srDynamicData.CurrentStock.StockClose ) { if ( trendData.CSR > fSRCK_S ) fSRCK_S = trendData.CSR; } } if ( fSRCK_R != float.MaxValue ) { srDynamicData.DynamicSRCK_R = MSFL.FormatPrice( ( ( fSRCK_R - srDynamicData.CurrentStock.StockClose ) / srDynamicData.CurrentStock.StockClose ) * 100 ); srDynamicData.DynamicSRCK_RV = MSFL.FormatPrice( fSRCK_R ); } if ( fSRCK_S != float.MinValue ) { srDynamicData.DynamicSRCK_S = MSFL.FormatPrice( ( ( srDynamicData.CurrentStock.StockClose - fSRCK_S ) / srDynamicData.CurrentStock.StockClose ) * 100 ); srDynamicData.DynamicSRCK_SV = MSFL.FormatPrice( fSRCK_S ); } SRReport srReport = new SRReport(); srReport.SRStaticData = srStaticData; srReport.SRDynamicData = srDynamicData; return srReport; }