/// <summary> /// сохранить серию тиков /// </summary> /// <param name="trades">тики</param> /// <param name="path">путь</param> /// <param name="securityName">имя бумаги</param> /// <param name="startIndex">индекс для старта сохранения</param> private void SaveThisTick(List <Trade> trades, string path, string securityName, int startIndex) { if (_tradeSaveInfo == null) { _tradeSaveInfo = new List <TradeSaveInfo>(); } // берём хранилище тиков TradeSaveInfo tradeSaveInfo = _tradeSaveInfo.Find(info => info.NameSecurity == securityName); if (tradeSaveInfo == null) { tradeSaveInfo = new TradeSaveInfo(); tradeSaveInfo.NameSecurity = securityName; tradeSaveInfo.LastSaveObjectTime = trades[startIndex].Time; _tradeSaveInfo.Add(tradeSaveInfo); if (File.Exists(path)) { File.Delete(path); } } int firstCandle = 0; if (tradeSaveInfo.LastSaveObjectTime == trades[trades.Count - 1].Time) { // если у нас старые тики совпадают с новыми. return; } for (int i = trades.Count - 1; i > -1; i--) { if (trades[i].Time <= tradeSaveInfo.LastSaveObjectTime || startIndex >= i) { firstCandle = i + 1; break; } } tradeSaveInfo.LastSaveObjectTime = trades[trades.Count - 1].Time; // записываем try { using (StreamWriter writer = new StreamWriter(path, true)) { for (int i = firstCandle; i < trades.Count; i++) { writer.WriteLine(trades[i].GetSaveString()); } } } catch { } }
/// <summary> /// метод в котором работает поток сохраняющий тики в различные файлы /// </summary> private void TickSaverSpaceInFiles() { _tradeSaveInfo = new List <TradeSaveInfo>(); try { if (!Directory.Exists(_pathName)) { Directory.CreateDirectory(_pathName); } while (true) { Thread.Sleep(15000); if (_server.ServerStatus != ServerConnectStatus.Connect) { continue; } if (NeadToSave == false) { continue; } if (_weLoadTrades == false) { continue; } List <Trade>[] allTrades = _server.AllTrades; for (int i1 = 0; allTrades != null && Thread.CurrentThread.Name != "deleteThread" && i1 < allTrades.Length; i1++) { if (allTrades[i1].Count == 0) { continue; } if (MainWindow.ProccesIsWorked == false) { // если приложение закрывается return; } if (_securities == null || (_securities != null && _securities.Find(security => security.Name == allTrades[i1][0].SecurityNameCode) == null)) { continue; } TradeSaveInfo tradeInfo = _tradeSaveInfo.Find(s => s.NameSecurity == allTrades[i1][0].SecurityNameCode); if (tradeInfo == null) { tradeInfo = new TradeSaveInfo(); tradeInfo.NameSecurity = allTrades[i1][0].SecurityNameCode; _tradeSaveInfo.Add(tradeInfo); } if (tradeInfo.LastSaveIndex == allTrades[i1].Count) { continue; } int lastSecond = allTrades[i1][tradeInfo.LastSaveIndex].Time.Second; int lastMillisecond = allTrades[i1][tradeInfo.LastSaveIndex].MicroSeconds; string _timepath = allTrades[i1][0].Time.ToString("yyyy_MM_dd"); StreamWriter writer = new StreamWriter(_pathName + @"\" + allTrades[i1][0].SecurityNameCode + "_" + _timepath + ".txt", true); for (int i = tradeInfo.LastSaveIndex; i < allTrades[i1].Count - 1; i++) { string timepath = allTrades[i1][i].Time.ToString("yyyy_MM_dd"); if (timepath != _timepath) { writer.Close(); writer = new StreamWriter(_pathName + @"\" + allTrades[i1][0].SecurityNameCode + "_" + timepath + ".txt", true); _timepath = timepath; } if (allTrades[i1][i].MicroSeconds == 0) { // генерим какое-то время микросекунд, если нам коннектор их не выдал if (lastSecond != allTrades[i1][i].Time.Second) { lastMillisecond = 0; lastSecond = allTrades[i1][i].Time.Second; } allTrades[i1][i].MicroSeconds = lastMillisecond += 10; } writer.WriteLine(allTrades[i1][i].GetSaveString()); } tradeInfo.LastSaveIndex = allTrades[i1].Count - 1; writer.Close(); } } } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } }
/// <summary> /// upload ticks /// загрузить тики /// </summary> /// <param name="dayCount"> number of days for uploading / количество дней которые нужно подгрузить </param> public void LoadTick() { try { if (!Directory.Exists(_pathName)) { _weLoadTrades = true; return; } List <Trade>[] allTrades = _server.AllTrades; string[] saves = Directory.GetFiles(_pathName); for (int i = 0; i < saves.Length; i++) { string nameSecurity; try { string[] array = saves[i].Split('\\'); string[] _name = array[2].Split('_'); nameSecurity = _name[0]; DateTime _startDate = new DateTime(Convert.ToInt32(_name[1]), Convert.ToInt32(_name[2]), Convert.ToInt32(_name[3].Split('.')[0])); if (_startDate < DateTime.Now.ToUniversalTime().AddDays(-DaysToLoad)) { continue; } } catch { continue; } // upload / загружаем StreamReader reader = new StreamReader(saves[i]); List <Trade> newList = new List <Trade>(); try { DateTime timeStart = DateTime.Now.AddDays(-DaysToLoad - 1); if (timeStart.Month == 1 && timeStart.Day < 10) { timeStart = timeStart.AddDays(-10); } List <string> tradesInStr = new List <string>(); while (!reader.EndOfStream) { tradesInStr.Add(reader.ReadLine()); } for (int i2 = 0; i2 < tradesInStr.Count; i2++) { Trade newTrade = new Trade(); try { newTrade.SetTradeFromString(tradesInStr[i2]); } catch { continue; } newTrade.SecurityNameCode = nameSecurity; if (newTrade.Time.Date < timeStart.Date) { i2 += 100; continue; } newList.Add(newTrade); } } catch (Exception) { continue; } // save / сохраняем if (newList.Count == 0) { continue; } if (_tradeSaveInfo.Find(s => s.NameSecurity == newList[0].SecurityNameCode) == null) { TradeSaveInfo tradeInfo = new TradeSaveInfo(); tradeInfo.NameSecurity = newList[0].SecurityNameCode; tradeInfo.LastSaveIndex = newList.Count; _tradeSaveInfo.Add(tradeInfo); } if (allTrades == null) { allTrades = new[] { newList }; } else { int _indextradeinfo = _tradeSaveInfo.FindIndex(s => s.NameSecurity == newList[0].SecurityNameCode); List <Trade>[] newListsArray = new List <Trade> [_tradeSaveInfo.Count]; for (int ii = 0; ii < allTrades.Length; ii++) { if (newListsArray[ii] == null) { newListsArray[ii] = new List <Trade>(); } newListsArray[ii] = allTrades[ii]; } if (newListsArray[_indextradeinfo] == null) { newListsArray[_indextradeinfo] = new List <Trade>(); } newListsArray[_indextradeinfo].AddRange(newList); allTrades = newListsArray; } reader.Close(); } for (int ii = 0; ii < _tradeSaveInfo.Count; ii++) { _tradeSaveInfo[ii].LastSaveIndex = allTrades[ii].Count; } if (TickLoadedEvent != null) { TickLoadedEvent(allTrades); } } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } _weLoadTrades = true; }
/// <summary> /// загрузить тики /// </summary> /// <param name="dayCount">количество дней которые нужно подгрузить</param> public void LoadTick() { try { if (!Directory.Exists(_pathName)) { _weLoadTrades = true; return; } List <Trade>[] allTrades = _server.AllTrades; string[] saves = Directory.GetFiles(_pathName); for (int i = 0; i < saves.Length; i++) { // загружаем StreamReader reader = new StreamReader(saves[i]); List <Trade> newList = new List <Trade>(); string nameSecurity; try { string[] array = saves[i].Split('\\'); nameSecurity = array[2].Split('.')[0]; } catch { continue; } try { DateTime timeStart = DateTime.Now.AddDays(-DaysToLoad - 2); if (timeStart.Month == 1 && timeStart.Day < 10) { timeStart = timeStart.AddDays(-10); } while (!reader.EndOfStream) { Trade newTrade = new Trade(); try { newTrade.SetTradeFromString(reader.ReadLine()); } catch { continue; } newTrade.SecurityNameCode = nameSecurity; if (newTrade.Time.Date < timeStart.Date) { continue; } newList.Add(newTrade); } } catch (Exception) { continue; } // сохраняем if (newList.Count == 0) { continue; } if (_tradeSaveInfo.Find(s => s.NameSecurity == newList[0].SecurityNameCode) == null) { TradeSaveInfo tradeInfo = new TradeSaveInfo(); tradeInfo.NameSecurity = newList[0].SecurityNameCode; tradeInfo.LastSaveIndex = newList.Count; _tradeSaveInfo.Add(tradeInfo); } if (allTrades == null) { allTrades = new[] { newList }; } else { List <Trade>[] newListsArray = new List <Trade> [allTrades.Length + 1]; for (int ii = 0; ii < allTrades.Length; ii++) { newListsArray[ii] = allTrades[ii]; } newListsArray[newListsArray.Length - 1] = newList; allTrades = newListsArray; } reader.Close(); } if (TickLoadedEvent != null) { TickLoadedEvent(allTrades); } } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } _weLoadTrades = true; }
// сохранение во множество файлов /// <summary> /// загрузить тики из файлов /// </summary> public void LoadTick() { if (_server.ServerType == ServerType.InteractivBrokers) { LoadTickInOnFile(); return; } if (!Directory.Exists(_pathName)) { return; } if (DaysToLoad == 0) { return; } string[] saves = Directory.GetFiles(_pathName); List <Trade>[] allTrades = null; for (int i = 0; i < saves.Length; i++) { // загружаем StreamReader reader = new StreamReader(saves[i]); List <Trade> newList = new List <Trade>(); string nameSecurity; try { string[] array = saves[i].Split('\\'); nameSecurity = array[2].Split('.')[0]; nameSecurity = nameSecurity.Split('@')[0]; } catch { continue; } try { while (!reader.EndOfStream) { Trade newTrade = new Trade(); newTrade.SetTradeFromString(reader.ReadLine()); newTrade.SecurityNameCode = nameSecurity; newList.Add(newTrade); } } catch (Exception) { // ignore } if (newList.Count == 0) { continue; } // сохраняем в общий массив bool isInArray = false; for (int indAllTrades = 0; allTrades != null && indAllTrades < allTrades.Length; indAllTrades++) { if (allTrades[indAllTrades][0].SecurityNameCode == newList[0].SecurityNameCode) { isInArray = true; break; } } if (allTrades == null || !isInArray) { // если у нас такого тикера в коллекции ещё нет. if (allTrades == null) { allTrades = new[] { newList }; } else { List <Trade>[] newListsArray = new List <Trade> [allTrades.Length + 1]; for (int ii = 0; ii < allTrades.Length; ii++) { newListsArray[ii] = allTrades[ii]; } newListsArray[newListsArray.Length - 1] = newList; allTrades = newListsArray; } } else {// если такой тикер уже есть. И надо сортировать List <Trade> listOld = allTrades.First(list => list[0].SecurityNameCode == newList[0].SecurityNameCode); if (listOld.FindIndex(trade => trade.Time < newList[0].Time) == -1) { // старый массив целиком больше по времени чем новый newList.AddRange(listOld); for (int indLists = 0; indLists < allTrades.Length; indLists++) { if (allTrades[indLists][0].SecurityNameCode == newList[0].SecurityNameCode) { allTrades[indLists] = newList; break; } } } else if (listOld[listOld.Count - 1].Time < newList[0].Time) { // старый массив целиком меньше по времени чем новый listOld.AddRange(newList); } else { // в старый массив нужно вставить новый в середину /* for (int indexList = 0; indexList < newList.Count; indexList++) * { * int index = listOld.FindIndex(trade => trade.Time < newList[0].Time); * * listOld.Insert(index, newList[indexList]); * }*/ } } reader.Close(); } // считаем сколько дней в архиве и обрезаем for (int i = 0; allTrades != null && i < allTrades.Length; i++) { List <Trade> lastList = allTrades[i]; int dayCount = 0; int lastDay = -1; for (int iii = 0; iii < lastList.Count; iii++) { if (lastDay == -1 || lastDay != lastList[iii].Time.Day) { dayCount++; lastDay = lastList[iii].Time.Day; } } if (dayCount > DaysToLoad) { // обрезаме лишнее int dayToLost = dayCount - DaysToLoad; lastDay = -1; dayCount = 0; List <Trade> newNewList = new List <Trade>(); for (int iii = 0; iii < lastList.Count; iii++) { if (lastDay == -1 || lastDay != lastList[iii].Time.Day) { dayToLost--; dayCount++; lastDay = lastList[iii].Time.Day; } if (dayToLost < 0) { newNewList.Add(lastList[iii]); } } for (int indLists = 0; indLists < allTrades.Length; indLists++) { if (allTrades[indLists][0].SecurityNameCode == newNewList[0].SecurityNameCode) { allTrades[indLists] = newNewList; break; } } } } //собираем объекты хранящие данные для хранения тиков в файле for (int i = 0; allTrades != null && i < allTrades.Length; i++) { if (_tradeSaveInfo == null) { _tradeSaveInfo = new List <TradeSaveInfo>(); } TradeSaveInfo tradeSaveInfo = _tradeSaveInfo.Find(info => info.NameSecurity == allTrades[i][0].SecurityNameCode); if (tradeSaveInfo == null) { tradeSaveInfo = new TradeSaveInfo(); tradeSaveInfo.NameSecurity = allTrades[i][0].SecurityNameCode; tradeSaveInfo.LastSaveObjectTime = allTrades[i][allTrades[i].Count - 1].Time; _tradeSaveInfo.Add(tradeSaveInfo); } } // высылаем данные на верх if (TickLoadedEvent != null) { TickLoadedEvent(allTrades); } }
// для сохранения в один файл /// <summary> /// метод в котором работает поток сохраняющий тики /// </summary> private void TickSaverSpaceInOneFile() { _tradeSaveInfo = new List <TradeSaveInfo>(); try { if (!Directory.Exists(_pathName)) { Directory.CreateDirectory(_pathName); } while (true) { Thread.Sleep(15000); if (_server.ServerStatus != ServerConnectStatus.Connect) { continue; } if (NeadToSave == false) { continue; } if (_weLoadTrades == false) { continue; } List <Trade>[] allTrades = _server.AllTrades; for (int i1 = 0; allTrades != null && Thread.CurrentThread.Name != "deleteThread" && i1 < allTrades.Length; i1++) { if (allTrades[i1].Count == 0) { continue; } if (MainWindow.ProccesIsWorked == false) { // если приложение закрывается return; } if (_securities == null || (_securities != null && _securities.Find(security => security.Name == allTrades[i1][0].SecurityNameCode) == null)) { continue; } TradeSaveInfo tradeInfo = _tradeSaveInfo.Find(s => s.NameSecurity == allTrades[i1][0].SecurityNameCode); if (tradeInfo == null) { tradeInfo = new TradeSaveInfo(); tradeInfo.NameSecurity = allTrades[i1][0].SecurityNameCode; _tradeSaveInfo.Add(tradeInfo); StreamWriter writer = new StreamWriter(_pathName + @"\" + allTrades[i1][0].SecurityNameCode + ".txt", false); StringBuilder saveStr = new StringBuilder(); for (int i = 0; i < allTrades[i1].Count - 1; i++) { saveStr.Append(allTrades[i1][i].GetSaveString() + "\r\n"); } tradeInfo.LastSaveIndex = allTrades[i1].Count - 1; writer.Write(saveStr); writer.Close(); } else { if (tradeInfo.LastSaveIndex == allTrades[i1].Count) { continue; } StreamWriter writer = new StreamWriter(_pathName + @"\" + allTrades[i1][0].SecurityNameCode + ".txt", true); StringBuilder saveStr = new StringBuilder(); for (int i = tradeInfo.LastSaveIndex; i < allTrades[i1].Count - 1; i++) { saveStr.Append(allTrades[i1][i].GetSaveString() + "\r\n"); } tradeInfo.LastSaveIndex = allTrades[i1].Count - 1; writer.Write(saveStr); writer.Close(); } } } } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } }
public List <Trade> LoadTrades() { List <Trade> result = new List <Trade>(); string pathToSet = "Data\\Temp\\" + SetName + "\\"; string path = pathToSet + SecurityName.Replace("/", "").Replace("*", "") + "\\" + "Tick\\"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } if (_tradeSaveInfo == null) { _tradeSaveInfo = new List <TradeSaveInfo>(); } TradeSaveInfo tradeSaveInfo = _tradeSaveInfo.Find(info => info.NameSecurity == SecurityName); if (tradeSaveInfo == null) { // if we save these trades for the first time, we try to pick them up from the file/если сохраняем эти тики в первый раз, пробуем поднять их из файла tradeSaveInfo = new TradeSaveInfo(); tradeSaveInfo.NameSecurity = SecurityName; _tradeSaveInfo.Add(tradeSaveInfo); string[] files = Directory.GetFiles(path); if (files.Length != 0) { try { using (StreamReader reader = new StreamReader(files[0])) { string str = ""; while (!reader.EndOfStream) { str = reader.ReadLine(); if (str != "") { Trade trade = new Trade(); trade.SetTradeFromString(str); trade.SecurityNameCode = SecurityName; tradeSaveInfo.LastSaveObjectTime = trade.Time; tradeSaveInfo.LastTradeId = trade.Id; result.Add(trade); } } } } catch (Exception error) { if (NewLogMessageEvent != null) { NewLogMessageEvent(error.ToString(), LogMessageType.Error); } return(result); } } } return(result); }
/// <summary> /// save trades series/сохранить серию тиков /// </summary> /// <param name="tradeLast">trades/тики</param> /// <param name="pathToFolder">path/путь</param> /// <param name="securityName">security Name/имя бумаги</param> private void SaveThisTick(Trade tradeLast, string pathToFolder, string securityName, StreamWriter writer, string pathToFile) { if (!Directory.Exists(pathToFolder)) { Directory.CreateDirectory(pathToFolder); } if (_tradeSaveInfo == null) { _tradeSaveInfo = new List <TradeSaveInfo>(); } // take trades storage/берём хранилище тиков TradeSaveInfo tradeSaveInfo = _tradeSaveInfo.Find(info => info.NameSecurity == securityName); if (tradeSaveInfo == null) { // if we save these trades for the first time, we try to pick them up from the file/если сохраняем эти тики в первый раз, пробуем поднять их из файла tradeSaveInfo = new TradeSaveInfo(); tradeSaveInfo.NameSecurity = securityName; _tradeSaveInfo.Add(tradeSaveInfo); string[] files = Directory.GetFiles(pathToFolder); if (files.Length != 0) { if (writer != null) { writer.Close(); writer = null; } try { using (StreamReader reader = new StreamReader(files[0])) { string str = ""; while (!reader.EndOfStream) { str = reader.ReadLine(); } if (str != "") { Trade trade = new Trade(); trade.SetTradeFromString(str); tradeSaveInfo.LastSaveObjectTime = trade.Time; tradeSaveInfo.LastTradeId = trade.Id; } } } catch (Exception error) { if (NewLogMessageEvent != null) { NewLogMessageEvent(error.ToString(), LogMessageType.Error); } return; } } } if (tradeSaveInfo.LastSaveObjectTime > tradeLast.Time || (tradeLast.Id != null && tradeLast.Id == tradeSaveInfo.LastTradeId) ) { // if we have old trades coincide with new ones./если у нас старые тики совпадают с новыми. return; } tradeSaveInfo.LastSaveObjectTime = tradeLast.Time; tradeSaveInfo.LastTradeId = tradeLast.Id; // write down/записываем try { if (writer != null) { writer.WriteLine(tradeLast.GetSaveString()); } else { using ( StreamWriter writer2 = new StreamWriter(pathToFile + "\\" + securityName.Replace("/", "") + ".txt", true)) { writer2.WriteLine(tradeLast.GetSaveString()); } } } catch (Exception error) { if (NewLogMessageEvent != null) { NewLogMessageEvent(error.ToString(), LogMessageType.Error); } } }