bool CAppendTubeState::Match(std::vector<CDrillItem>& items) { int iSize = items.size(); if (iSize<2) { return false; } CDrillItem& item = items[iSize-1]; if (!Match(item)) { return false; } for (int i = iSize-2; i>=0; --i) { CDrillItem& item1 = items[i]; COleDateTimeSpan tmSpan(item.m_curTime-item1.m_curTime); if (!Match(item1)) { return true; } if (tmSpan>=m_tmSpan) { return false; } } return true; }
ENUM_TRANSSTATE CTrMonItem::GetMonState() { ENUM_TRANSSTATE nTransState = TRANSSTATE_UNKNOW; int nState = atoi(m_vData[TRCOLTYPE_STATE]); if (nState == DBNOTRANSVALUE) { //not in trans table, use custom state nTransState = TRANSSTATE_TRANSNONETIMESAFE; #ifdef _CIMTEST CTimeSpan tmSpan(atoi(m_vData[TRCOLTYPE_FIRSTIME]) - CTime(2012,10,20, 15,0,0).GetTime() ); #else CTimeSpan tmSpan( atoi(m_vData[TRCOLTYPE_FIRSTIME]) - time(NULL) ); #endif LONGLONG nDeta = tmSpan.GetTotalSeconds(); if ( nDeta <= 0) { nTransState = TRANSSTATE_TRANSNONETIMEOUT; } else if (nDeta <= g_monDataMgr.m_nOffsetSafeSecond) { if (nDeta <= g_monDataMgr.m_nCloseDoorSecond) { nTransState = TRANSSTATE_TRANSDOORCLOSED; } else { nTransState = TRANSSTATE_TRANSNONETIMEUNSAFE; } } } else { //use db state nTransState = g_monDataMgr.GetMonState(m_vData[TRCOLTYPE_STATE]); } return nTransState; }
CString CTrMonItem::GetValue( const ENUM_MONTYPE typeIn ) { switch (typeIn) { case MONTYPE_CHNAME: { return g_monDataMgr.DB2Show(TRCOLTYPE_CHANNELID, m_vData[TRCOLTYPE_CHANNELID]); }break; case MONTYPE_STATE: { int nState = atoi(m_vData[TRCOLTYPE_STATE]); if (nState == DBNOTRANSVALUE) { //not in trans table, use custom state ENUM_TRANSSTATE nTransState = TRANSSTATE_TRANSNONETIMESAFE; #ifdef _CIMTEST CTimeSpan tmSpan(atoi(m_vData[TRCOLTYPE_FIRSTIME]) - CTime(2012,10,20, 15,0,0).GetTime()); #else CTimeSpan tmSpan(atoi(m_vData[TRCOLTYPE_FIRSTIME]) - time(NULL)); #endif // _CIMTEST LONGLONG nDeta = tmSpan.GetTotalSeconds(); if ( nDeta <= 0) { nTransState = TRANSSTATE_TRANSNONETIMEOUT; } else if (nDeta < g_monDataMgr.m_nOffsetSafeSecond) { if (nDeta < g_monDataMgr.m_nCloseDoorSecond) { nTransState = TRANSSTATE_TRANSDOORCLOSED; } else { nTransState = TRANSSTATE_TRANSNONETIMEUNSAFE; } } return g_monDataMgr.GetMonStateTitle(nTransState); } else { //use db state return g_monDataMgr.DB2Show(TRCOLTYPE_STATE, m_vData[TRCOLTYPE_STATE]); } // }break; case MONTYPE_TIMEREMAIN: { #ifdef _CIMTEST CTimeSpan tmSpan(atoi(m_vData[TRCOLTYPE_FIRSTIME]) - CTime(2012,10,20, 15,0,0).GetTime()); #else CTimeSpan tmSpan(atoi(m_vData[TRCOLTYPE_FIRSTIME]) - time(NULL)); #endif // _DEBUG //CTimeSpan tmSpan( atoi(m_vData[TRCOLTYPE_FIRSTIME]) - time(NULL)); CString strFmt; strFmt.Format(TEXT("%02d:%02d:%02d"), (int)tmSpan.GetTotalHours(), tmSpan.GetMinutes(),tmSpan.GetSeconds()); return strFmt; }break; case MONTYPE_CLIPNAME: { return m_vData[TRCOLTYPE_PGMNAME]; }break; case MONTYPE_PGMCODE: { return m_vData[TRCOLTYPE_PGMID]; }break; case MONTYPE_INDEX: { return m_vData[TRCOLTYPE_INDEX]; }break; case MONTYPE_TOTALLENGTH: { return m_vData[TRCOLTYPE_TOTALLENTH]; }break; case MONTYPE_FIRSTTIME: { CTime tm(atoi(m_vData[TRCOLTYPE_FIRSTIME])); CString strFmt = tm.Format(TEXT("%Y-%m-%d %H:%M:%S")); return strFmt; }break; default: { ASSERT(FALSE); } } return TEXT(""); }
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; }