Esempio n. 1
0
        internal void Write(SeriesSymbolData series)
        {
            try {
                string sFile = string.Format("{0}\\{1}\\{2}", __sPath, (series.DataRequest.Resolution.TotalSeconds < Resolution.MAX_BASE_TOTALSECONDS) ? "mins" : "days", series.DataRequest.Symbol);
                using (FileStream cStream = new FileStream(sFile, (__bCreate) ? FileMode.Create : FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) {
                    if (!__bCreate)
                    {
                        long lCount = cStream.Length / MAX_BLOCK_SIZE;
                        if (lCount > 0)
                        {
                            FileSearchUtil.BinarySearch(cStream, lCount, MAX_BLOCK_SIZE, series.Time[0]);
                        }
                    }

                    ZBuffer cBuffer = new ZBuffer(64);

                    int iHistoryIndex = series.Indexer.HistoryIndex;
                    int iCount        = series.Count;
                    for (int i = 0; i < iCount; i++)
                    {
                        int iIndex = iHistoryIndex + i;
                        cBuffer.Length = 0;
                        cBuffer.Add(series.Time[iIndex]);
                        cBuffer.Add(series.Open[iIndex]);
                        cBuffer.Add(series.High[iIndex]);
                        cBuffer.Add(series.Low[iIndex]);
                        cBuffer.Add(series.Close[iIndex]);
                        cBuffer.Add(series.Volume[iIndex]);

                        cStream.Write(cBuffer.Data, 0, cBuffer.Length);
                    }
                }
                if (logger.IsInfoEnabled)
                {
                    logger.InfoFormat("[FileWrite] {0} write completed...  count={1}", sFile, series.Count);
                }
            } catch (Exception __errExcep) {
                if (logger.IsErrorEnabled)
                {
                    logger.ErrorFormat("[FileWrite] '{0}' write error...", series.DataRequest.Symbol, series.Count);
                }
                if (logger.IsErrorEnabled)
                {
                    logger.ErrorFormat("{0}/r/n{1}", __errExcep.Message, __errExcep.StackTrace);
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        ///   取代資訊
        /// </summary>
        /// <param name="series">SeriesSymbolData 類別</param>
        /// <param name="date">欲取代的日期(該指定的日期的資料會被取代掉)</param>
        internal void Replace(SeriesSymbolData series, DateTime date)
        {
            try {
                string sFile = string.Format("{0}\\{1}\\{2}", __sPath, (series.DataRequest.Resolution.TotalSeconds < Resolution.MAX_BASE_TOTALSECONDS) ? "mins" : "days", series.DataRequest.Symbol);
                using (FileStream cStream = new FileStream(sFile, (__bCreate) ? FileMode.Create : FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) {
                    bool bFind = true;
                    if (!__bCreate)
                    {
                        long lCount = cStream.Length / MAX_BLOCK_SIZE;
                        bFind = FileSearchUtil.BinarySearch(cStream, lCount, MAX_BLOCK_SIZE, date);
                    }

                    if (bFind)
                    {
                        long lCurrentP = cStream.Position;

                        //先保留後面的資料以便插入時不會被覆蓋
                        ZBuffer cTemp = null;
                        FileSearchUtil.SearchNextDate(cStream, MAX_BLOCK_SIZE, date);
                        long lNextPos = cStream.Position;
                        long lRevSize = cStream.Length - lNextPos;

                        if (lRevSize > 0)
                        {
                            cTemp = new ZBuffer((int)lRevSize);
                            cStream.Read(cTemp.Data, 0, (int)lRevSize);
                            cTemp.Length = (int)lRevSize;
                        }

                        cStream.SetLength(lCurrentP + 1);
                        cStream.Position = lCurrentP;                         //移動置固定位置

                        ZBuffer cBuffer = new ZBuffer(64);

                        int iHistoryIndex = series.Indexer.HistoryIndex;
                        int iCount        = series.Count;
                        for (int i = 0; i < iCount; i++)
                        {
                            int iIndex = iHistoryIndex + i;
                            cBuffer.Length = 0;
                            cBuffer.Add(series.Time[iIndex]);
                            cBuffer.Add(series.Open[iIndex]);
                            cBuffer.Add(series.High[iIndex]);
                            cBuffer.Add(series.Low[iIndex]);
                            cBuffer.Add(series.Close[iIndex]);
                            cBuffer.Add(series.Volume[iIndex]);

                            cStream.Write(cBuffer.Data, 0, cBuffer.Length);
                        }

                        if (cTemp != null)
                        {
                            cStream.Write(cTemp.Data, 0, cTemp.Length);                              //再將後面的資料合併
                        }
                    }
                }
                if (logger.IsInfoEnabled)
                {
                    logger.InfoFormat("[FileWrite] {0} replace completed...  count={1}", sFile, series.Count);
                }
            } catch (Exception __errExcep) {
                if (logger.IsErrorEnabled)
                {
                    logger.ErrorFormat("[FileWrite] '{0}' replace error...", series.DataRequest.Symbol, series.Count);
                }
                if (logger.IsErrorEnabled)
                {
                    logger.ErrorFormat("{0}/r/n{1}", __errExcep.Message, __errExcep.StackTrace);
                }
            }
        }