/// <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);
        }
Beispiel #3
0
        /// <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 из файла
        }
Beispiel #4
0
 /// <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;
 }
Beispiel #5
0
 private string MakeFilePath(SignalStorageKey key)
 {
     return storageFolder + "\\" + key.categoryId + "\\" + key.ticker + "_" + key.timeframe + ".xml";
 }
Beispiel #6
0
        /// <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");
 }