/// <summary> /// получить собственно XML торгового сигнала (объекты графика) /// </summary> public string GetTradeSignalXml(SignalStorageKey key) { // проверить наличие файла var filePath = MakeFilePath(key); try { if (!File.Exists(filePath)) { return(string.Empty); } } catch (Exception ex) { Logger.ErrorFormat("SignalStorage.GetTradeSignalXml({0}) error: {1}", filePath, ex); return(string.Empty); } // получить доступ к файлу var locker = fileLockers.ReceiveValue(key); if (locker == null) { locker = new ReaderWriterLock(); fileLockers.UpdateValues(key, locker); } try { locker.AcquireReaderLock(LockTimeout); } catch (ApplicationException) { Logger.Error("SignalStorage.GetTradeSignalXml - read lock timeout"); return(string.Empty); } try { // прочитать файл using (var sw = new StreamReader(filePath, TradeSignalXml.DefaultEncoding)) { return(sw.ReadToEnd()); } } catch (Exception ex) { Logger.ErrorFormat("SignalStorage.GetTradeSignalXml - error reading file ({0}): {1}", filePath, ex); return(string.Empty); } finally { locker.ReleaseReaderLock(); } // загрузить XML из файла }
/// <summary> /// thread safe /// </summary> private bool WriteFile(SignalStorageKey key, string xml) { var filePath = MakeFilePath(key); // получить доступ на запись файла var locker = fileLockers.ReceiveValue(key); if (locker == null) { locker = new ReaderWriterLock(); fileLockers.UpdateValues(key, locker); } try { locker.AcquireWriterLock(LockTimeout); } catch (ApplicationException) { Logger.Error("SignalStorage.WriteFile - writer lock timeout"); return(false); } try { // обеспечить каталог файла if (!EnsureFileFolder(filePath)) { return(false); } // сохранить файл using (var sw = new StreamWriter(filePath, false, TradeSignalXml.DefaultEncoding)) { sw.Write(xml); } } catch (Exception ex) { Logger.ErrorFormat("SignalStorage.WriteFile - error writing file ({0}): {1}", filePath, ex); return(false); } finally { locker.ReleaseWriterLock(); } return(true); }
/// <summary> /// получить собственно XML торгового сигнала (объекты графика) /// </summary> public string GetTradeSignalXml(SignalStorageKey key) { // проверить наличие файла var filePath = MakeFilePath(key); try { if (!File.Exists(filePath)) return string.Empty; } catch (Exception ex) { Logger.ErrorFormat("SignalStorage.GetTradeSignalXml({0}) error: {1}", filePath, ex); return string.Empty; } // получить доступ к файлу var locker = fileLockers.ReceiveValue(key); if (locker == null) { locker = new ReaderWriterLock(); fileLockers.UpdateValues(key, locker); } try { locker.AcquireReaderLock(LockTimeout); } catch (ApplicationException) { Logger.Error("SignalStorage.GetTradeSignalXml - read lock timeout"); return string.Empty; } try { // прочитать файл using (var sw = new StreamReader(filePath, TradeSignalXml.DefaultEncoding)) { return sw.ReadToEnd(); } } catch (Exception ex) { Logger.ErrorFormat("SignalStorage.GetTradeSignalXml - error reading file ({0}): {1}", filePath, ex); return string.Empty; } finally { locker.ReleaseReaderLock(); } // загрузить XML из файла }
/// <summary> /// thread safe /// </summary> private bool WriteFile(SignalStorageKey key, string xml) { var filePath = MakeFilePath(key); // получить доступ на запись файла var locker = fileLockers.ReceiveValue(key); if (locker == null) { locker = new ReaderWriterLock(); fileLockers.UpdateValues(key, locker); } try { locker.AcquireWriterLock(LockTimeout); } catch (ApplicationException) { Logger.Error("SignalStorage.WriteFile - writer lock timeout"); return false; } try { // обеспечить каталог файла if (!EnsureFileFolder(filePath)) return false; // сохранить файл using (var sw = new StreamWriter(filePath, false, TradeSignalXml.DefaultEncoding)) { sw.Write(xml); } } catch (Exception ex) { Logger.ErrorFormat("SignalStorage.WriteFile - error writing file ({0}): {1}", filePath, ex); return false; } finally { locker.ReleaseWriterLock(); } return true; }
private string MakeFilePath(SignalStorageKey key) { return storageFolder + "\\" + key.categoryId + "\\" + key.ticker + "_" + key.timeframe + ".xml"; }
/// <summary> /// обновить торговые рекомендации (список объектов в формате XML) /// </summary> /// <param name="signalCatId">категория сигнала</param> /// <param name="ticker">тикер (USDCHF...)</param> /// <param name="timeframe">таймфрейм прогноза</param> /// <param name="signalXml">XML (well-formed) в виде строки</param> public void UpdateSignal(int signalCatId, string ticker, BarSettings timeframe, string signalXml) { // проверить параметры if (string.IsNullOrEmpty(signalXml)) { Logger.ErrorFormat("UpdateSignal (cat={0}) error: signalXml is empty", signalCatId); return; } if (!DalSpot.Instance.GetTickerNames().Contains(ticker)) { Logger.ErrorFormat("UpdateSignal (cat={0}) error: ticker \"{1}\" is not found", signalCatId, ticker); return; } // проверить XML if (!TradeSignalXml.XmlIsValid(ref signalXml, true)) { Logger.ErrorFormat("UpdateSignal (cat={0}) error: ", signalCatId, ticker); return; } // записать файл var key = new SignalStorageKey {categoryId = signalCatId, ticker = ticker, timeframe = timeframe}; if (!WriteFile(key, signalXml)) return; // обновить словарь dicUpdateLocker try { dicUpdateLocker.AcquireWriterLock(LockTimeout); } catch (ApplicationException) { Logger.Error("SignalStorage - updateTimes write lock timeout"); return; } try { if (updateTimes.ContainsKey(key)) updateTimes[key] = DateTime.Now; else updateTimes.Add(key, DateTime.Now); } catch (Exception ex) { Logger.Error("SignalStorage - updateTimes update error", ex); return; } finally { dicUpdateLocker.ReleaseWriterLock(); } }
/// <summary> /// обновить торговые рекомендации (список объектов в формате XML) /// </summary> /// <param name="signalCatId">категория сигнала</param> /// <param name="ticker">тикер (USDCHF...)</param> /// <param name="timeframe">таймфрейм прогноза</param> /// <param name="signalXml">XML (well-formed) в виде строки</param> public void UpdateSignal(int signalCatId, string ticker, BarSettings timeframe, string signalXml) { // проверить параметры if (string.IsNullOrEmpty(signalXml)) { Logger.ErrorFormat("UpdateSignal (cat={0}) error: signalXml is empty", signalCatId); return; } if (!DalSpot.Instance.GetTickerNames().Contains(ticker)) { Logger.ErrorFormat("UpdateSignal (cat={0}) error: ticker \"{1}\" is not found", signalCatId, ticker); return; } // проверить XML if (!TradeSignalXml.XmlIsValid(ref signalXml, true)) { Logger.ErrorFormat("UpdateSignal (cat={0}) error: ", signalCatId, ticker); return; } // записать файл var key = new SignalStorageKey { categoryId = signalCatId, ticker = ticker, timeframe = timeframe }; if (!WriteFile(key, signalXml)) { return; } // обновить словарь dicUpdateLocker try { dicUpdateLocker.AcquireWriterLock(LockTimeout); } catch (ApplicationException) { Logger.Error("SignalStorage - updateTimes write lock timeout"); return; } try { if (updateTimes.ContainsKey(key)) { updateTimes[key] = DateTime.Now; } else { updateTimes.Add(key, DateTime.Now); } } catch (Exception ex) { Logger.Error("SignalStorage - updateTimes update error", ex); return; } finally { dicUpdateLocker.ReleaseWriterLock(); } }
private string MakeFilePath(SignalStorageKey key) { return(storageFolder + "\\" + key.categoryId + "\\" + key.ticker + "_" + key.timeframe + ".xml"); }