bool CTimeStampTester::GeneralTest() { CTimeStamp Yesterday; CTimeStamp Today; CTimeStamp Tommorow; CTimePeriod OneDay(24 * 60 * 60 * 1000); CTimePeriod TwoDays(48 * 60 * 60 * 1000); Today.GetSystemTime(); Yesterday = Today - OneDay; Tommorow = Today + OneDay; //LogEvent(LE_DEBUG, "OneDay: %s", OneDay.ToString().c_str()); //LogEvent(LE_DEBUG, "TwoDays: %s", TwoDays.ToString().c_str()); // LogEvent(LE_DEBUG, "CTimeStamp: Today: %s", Today.ToString().c_str()); // LogEvent(LE_DEBUG, "CTimeStamp: Yesterday: %s", Yesterday.ToString().c_str()); // LogEvent(LE_DEBUG, "CTimeStamp: Tommorow: %s", Tommorow.ToString().c_str()); return Today > Yesterday && Tommorow > Today && Tommorow - Yesterday == TwoDays; }
char* CHSDownloadData::MakeReqPacket( CodeInfo* pCode, short nPeriod , long &lReqLen) { if ( pCode == NULL || IsBadReadPtr(pCode,1)) return NULL; BOOL bChangeRange = FALSE; BOOL bDownLoaded = FALSE; CString str; str.Format("%d-%s",pCode->m_cCodeType,pCode->GetCode()); /* TaskItem* m_pTaskItem = NULL;*/ if( m_pTaskItem && !IsBadReadPtr(m_pTaskItem,1) && m_pTaskItem->m_TaskName.Compare(str) ) { m_pTaskItem->SetDayTaskFinished(); m_pTaskItem->SetMinute1TaskFinished(); m_pTaskItem->SetMinute5TaskFinished(); return NULL; } m_DownLoadCount = 0; int nAfterBegin = 1300,nAfterEnd = 1500; short nGZIndex = MakeGZIndex(pCode->m_cCodeType); short nQihuo = MakeMarket(pCode->m_cCodeType); if (nQihuo == FUTURES_MARKET) { if (nGZIndex) { nAfterEnd = 1515; } else { nAfterBegin = 1330; } } //取本地缓存中已有的数据 GetLocalData(pCode,nPeriod,m_pTaskItem); CArray<DateRange,DateRange> ayDate; CTime t1 = GetNowTime(nPeriod); CTimeSpan tSpan = GetTimeStep(nPeriod); unsigned long nLimitTime = GetLimitDate(pCode,nPeriod,m_nLimitedDay);//修正2012时间问题 unsigned long nEarliestTime = GetIntTimeFromTime(t1,nPeriod);//修正2012时间问题 unsigned long nTodayTime = nEarliestTime;//修正2012时间问题 long lCurDate = 10; CTime tmNow = CTime::GetCurrentTime(); lCurDate = tmNow.GetYear() * 10000 + tmNow.GetMonth() * 100 + tmNow.GetDay(); bDownLoaded = IsDownLoaded(lCurDate,pCode,nPeriod); try { BOOL bExistLastData = FALSE; BOOL bFirstDayRange = TRUE; CString strCode = pCode->GetCode(); StockDay* pStockDay = (StockDay*)m_pTaskItem->m_localData; for(int i = m_pTaskItem->m_localDataCount - 1; i >= 0; i--) { if (bDownLoaded) { break; } if(pStockDay[i].m_lDate <= 0) continue; if(pStockDay[i].m_lDate < nEarliestTime) nEarliestTime = pStockDay[i].m_lDate; if (pStockDay[i].m_lDate == 20000000) //修正错误的日期时间 { pStockDay[i].m_lDate = 19991231; } ///////////////若本地一存在的数据日期在限制时间内 则挑过数据的缺失检查///////////////////////////// if (i == m_pTaskItem->m_localDataCount - 1) { CTime tmNow = t1; CTime tmLastData = GetTimeFromIntTime(pStockDay[i].m_lDate,nPeriod); int nNowYear = tmNow.GetYear(); int nNowMonth = tmNow.GetMonth(); int nNowDay = tmNow.GetDay(); if ( nNowYear == tmLastData.GetYear() && nNowMonth == tmLastData.GetMonth() && tmLastData.GetDay() == nNowDay) { CTime tmlimit = GetTimeFromIntTime(nLimitTime,nPeriod); CTime tmFirstDate = GetTimeFromIntTime(pStockDay[0].m_lDate,nPeriod); if (m_nLimitedDay == 0) { if ( PERIOD_TYPE_DAY != nPeriod) { int nMaxDays = 0; if (nGZIndex) nMaxDays = 36 - 1; //36 = (10000/240 * 240)/270 else nMaxDays = 41 - 1; //41= 10000/240 long lLastDate = tmLastData.GetYear() * 10000 + tmLastData.GetMonth() * 100 + tmLastData.GetDay(); if (lLastDate != lCurDate) { nMaxDays --; } CTimeSpan tmSpan(1,0,0,0); int nCount = 0; while(nCount < nMaxDays) { tmLastData -= tmSpan; if (tmLastData.GetDayOfWeek() != 1&& tmLastData.GetDayOfWeek() != 7) { nCount ++; } } } if (PERIOD_TYPE_DAY == nPeriod) { if (tmFirstDate.GetYear() <= tmlimit.GetYear() && tmFirstDate.GetMonth() <= tmlimit.GetMonth() && tmFirstDate.GetDay() <= tmlimit.GetDay()) { bExistLastData = TRUE; } } else if (tmFirstDate.GetYear() <= tmLastData.GetYear() && tmFirstDate.GetMonth() <= tmLastData.GetMonth() && tmFirstDate.GetDay() <= tmLastData.GetDay()) { bExistLastData = TRUE; } } else { if (tmFirstDate.GetYear() <= tmlimit.GetYear() && tmFirstDate.GetMonth() <= tmlimit.GetMonth() && tmFirstDate.GetDay() <= tmlimit.GetDay()) { bExistLastData = TRUE; } } if (bExistLastData) { break; } } } ////////////////////////////////////////////////////////////////////////// int nCount = 0; long lEndDate = 0; long lBeginDate = 0; CTime t2 = GetTimeFromIntTime(pStockDay[i].m_lDate,nPeriod); CTime t = t2; if (i != m_pTaskItem->m_localDataCount - 1) { t = t + tSpan; } while(t < t1) { if(t.GetDayOfWeek() != 1 && t.GetDayOfWeek() != 7 && t < t1) //1 = Sunday, 2 = Monday, ..., 7 = Saturday { if(lBeginDate == 0) lBeginDate = GetIntTimeFromTime(t,nPeriod); if (!bFirstDayRange) { lEndDate = GetIntTimeFromTime(t1 - tSpan,nPeriod); } else { while(t1.GetDayOfWeek()==1 || t1.GetDayOfWeek() == 7) { CTimeSpan OneDay(1,0,0,0); t1 -= OneDay; } lEndDate = GetIntTimeFromTime(t1,nPeriod); } nCount ++; break; } t = t + tSpan; }; t1 = t2; bFirstDayRange = FALSE; if(nCount > 0 && lBeginDate >= nLimitTime ) { if( lEndDate < nLimitTime) lEndDate = nLimitTime; CTime tmBegin = GetTimeFromIntTime(lBeginDate,nPeriod); CTime tmEnd = GetTimeFromIntTime(lEndDate,nPeriod); if (tmBegin.GetYear() == tmEnd.GetYear() && tmBegin.GetMonth() == tmEnd.GetMonth() && tmBegin.GetDay() == tmEnd.GetDay()) { if (tmBegin.GetHour()*100 + tmBegin.GetMinute() > 1130 && tmEnd.GetHour()*100 + tmEnd.GetMinute() < nAfterBegin) { continue; } } if (lBeginDate > lEndDate) { continue ; } DateRange dr; dr.m_nBeginDate = lBeginDate; dr.m_nEndDate = lEndDate; ayDate.Add(dr); } if (nCount == 0 && pStockDay[i].m_lDate <= nLimitTime) { break; } } //下载分钟线数据时按9840的倍数根往前下载,若没有最近41天的数据,则下载最近82天数据,依次类推,最多倒退41*18天 int nLimitedDays = 0,nPermitCount = 9840; if (ayDate.GetCount() < 1) { if(nEarliestTime > nLimitTime && !bExistLastData) //加入最后一段时间 { DateRange dr; dr.m_nBeginDate = nLimitTime; dr.m_nEndDate = nEarliestTime; ayDate.Add(dr); } } else { int nMaxDays = 0; DateRange LastDateRage = ayDate.GetAt(ayDate.GetUpperBound()); long nPreDate = GetPreDataDate(pCode,LastDateRage.m_nBeginDate,nPeriod); if (nGZIndex) nMaxDays = 36 - 1; //36 = (10000/240 * 240)/270 else nMaxDays = 41 - 1; //41= 10000/240 long nEarlyLimitedDate = nLimitTime; if (PERIOD_TYPE_DAY != nPeriod) { nEarlyLimitedDate = GetPreDate(pStockDay[m_pTaskItem->m_localDataCount -1].m_lDate,nMaxDays,nPeriod); long nCheckDataCount = GetDayDataCount(pCode,nEarlyLimitedDate,nTodayTime,nPeriod); if (nCheckDataCount > nPermitCount) { int nSurplusCount = nCheckDataCount - nPermitCount; nEarlyLimitedDate = GetChangedBeginDate(pCode,nEarlyLimitedDate,nSurplusCount,nPeriod); } } if (nPreDate >= nEarlyLimitedDate) { DateRange dr; dr.m_nBeginDate = nEarlyLimitedDate > nLimitTime ? nEarlyLimitedDate : nLimitTime; dr.m_nEndDate = nPreDate; ayDate.Add(dr); } } CArray<DateRange,DateRange> ayDateChange; int nDateCount = ayDate.GetCount(); nPermitCount = nPermitCount*(m_nReloadDegree + 1); for (int i = nDateCount - 1; i>= 0; i--) { DateRange dateRange = ayDate.GetAt(i); long nRangeCount = GetDayDataCount(pCode,dateRange.m_nBeginDate,dateRange.m_nEndDate,nPeriod); nLimitedDays += nRangeCount; if (nLimitedDays < nPermitCount) { ayDateChange.Add(dateRange); } else { int nSpillCount = nLimitedDays - nPermitCount; dateRange.m_nBeginDate = GetChangedBeginDate(pCode,dateRange.m_nBeginDate,nSpillCount,nPeriod); ayDateChange.Add(dateRange); bChangeRange = TRUE; break; } } if (bChangeRange) { nDateCount = ayDateChange.GetCount(); } if (bDownLoaded) { bChangeRange = TRUE; ayDateChange.RemoveAll(); long nOutRangeDateB = 20101001; //国庆放假无交易行情 long nOutRangeDateE = 20101001; if (PERIOD_TYPE_DAY != nPeriod) { nOutRangeDateB = 2010010930; nOutRangeDateE = 2010010930; } DateRange dr; dr.m_nBeginDate = nOutRangeDateB; dr.m_nEndDate = nOutRangeDateE; nDateCount = ayDateChange.GetCount(); } short nCount = sizeof(ReqDayData) / sizeof(CodeInfo); if( sizeof(ReqDayData) % sizeof(CodeInfo) ) nCount++; int lLen = sizeof(AskData) + sizeof(CodeInfo) * (nCount - 1) + nDateCount * sizeof(DateRange); lReqLen = lLen; AskData* ask = (AskData*)(new char[lLen]); memset(ask,0,lLen); ask->m_nType = RT_TECHDATA_RANGE; ask->m_nSize = nCount; ask->m_lKey = nPeriod; memcpy(&ask->m_nPrivateKey, pCode, sizeof(CodeInfo)); ReqRangeDayData* pRequest = (ReqRangeDayData*)ask->m_pCode; pRequest->m_lBeginPosition = 0; pRequest->m_nDay = 0; pRequest->m_cPeriod = nPeriod; memcpy(&pRequest->m_ciCode, pCode, sizeof(CodeInfo)); pRequest->m_nDataRangCount = nDateCount; DateRange *pRane = pRequest->m_dataRange; CString strRequest,strRang; for(int nIndex = 0; nIndex < nDateCount; nIndex++) { if (bChangeRange) pRane[nIndex] = ayDateChange.GetAt(nIndex); else pRane[nIndex] = ayDate.GetAt(nIndex); m_DownLoadCount += GetDayDataCount(pCode,pRane[nIndex].m_nBeginDate,pRane[nIndex].m_nEndDate,nPeriod); strRang.Format("%d-%d;",pRane[nIndex].m_nBeginDate,pRane[nIndex].m_nEndDate); strRequest += strRang; } return (char*)ask; } catch (...) { } return NULL; }