﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Простой пример закачки истории тиков с финама или другого источника</title>
  <id>~/topic/4920/prostoi-primer-zakachki-istorii-tikov-s-finama-ili-drugogo-istochnika/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-03T23:20:52Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=4920" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/32825/</id>
    <title type="text">Спасибо большое вам! Буду разбираться...</title>
    <published>2015-03-10T20:49:49Z</published>
    <updated>2015-03-10T20:49:49Z</updated>
    <author>
      <name>dron3333</name>
      <uri>https://stocksharp.com/users/73020/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Спасибо большое вам! Буду разбираться...</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/32822/</id>
    <title type="text">Загрузка вчерашних данных для торговли на Квике. Код старый - не факт, что работает с новым API. usi...</title>
    <published>2015-03-10T16:09:38Z</published>
    <updated>2015-03-10T16:09:38Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Загрузка вчерашних данных для торговли на Квике. Код старый - не факт, что работает с новым API.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using Ecng.Common;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Candles.Compression;
using StockSharp.Algo.History;
using StockSharp.Algo.History.Finam;
using StockSharp.Algo.History.Rts;
using StockSharp.Algo.Storages;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Logging;

namespace VgnRobot.RobotEngine
{
	/// &amp;lt;summary&amp;gt;
	///		Базовый класс для свечных стратегий
	/// &amp;lt;/summary&amp;gt;
	public abstract class CandleStrategyBase : Strategy
	{
		public ITimeCheckProvider TimeCheckProvider { get; set; }
		public IStopProvider StopProvider { get; set; }


		//protected StopOrdersChecker stopOrdersChecker;
		public readonly SyncObject Locker = new SyncObject();
		
		protected CandleStrategyBase()
		{
			// добавление отдельного логирования стратегии
			LogManager = new LogManager();
			ExchangeBoard.Forts.ApplyHolidays2013();
			//ExchangeBoard.Forts.ApplyHolidays2012();
		}

		private void InitSettings()
		{
			decimal minStepPrice;
			MinStepPriceSetting = Settings.TryGetProperty(&amp;quot;MinStepPrice&amp;quot;, out minStepPrice, this)
															? minStepPrice
															: (decimal?)null;
		}

		private decimal? MinStepPriceSetting { get; set; }





		/// &amp;lt;summary&amp;gt;
		///  Настройки стратегии
		///	 (для доступа к общим настройкам из родителького класса)
		/// &amp;lt;/summary&amp;gt;
		public System.Configuration.SettingsBase Settings { get; set; }

		public CandleSeries Series { get; private set; }
		public virtual string Description { get { return Name; } }
		public ITraderBuilder TraderBuilder { get; set; }
		public IPortfolioSelector PortfolioSelector { get; set; }
		public ISecuritySelector SecuritySelector { get; set; }
		public IVolumeSizer VolumeSizer { get; set; }
		public IHistoryCandleProvider HistoryCandleProvider { get; set; }
		public ISettingsProvider SettingsProvider { get; set; }

		/// &amp;lt;summary&amp;gt;
		///  Движок создания заявок
		/// &amp;lt;/summary&amp;gt;
		public IOrderHelper OrderHelper { get; set; }
		
		public Unit PriceDelta { get; set; }

		public Type CandleFrameType { get; set; }
		/// &amp;lt;summary&amp;gt;
		///  Текстовая обёртка CandleFrameType. Работает в обе стороны.
		/// &amp;lt;/summary&amp;gt;
		public string CandleFrame
		{
			get
			{
				return CandleFrameType.Name;
			} 
			set
			{
				CandleFrameType = Type.GetType(string.Format(&amp;quot;StockSharp.Algo.Candles.{0}, StockSharp.Algo&amp;quot;, value), true);
			}
		}
		public object FrameSize { get; set; }


		DateTime _strategyStartTime;


		//public IList&amp;lt;Candle&amp;gt; GetHistoryTrades(DateTime beginDate, DateTime endDate)
		//{
		//	string uri = GetInstrumentUrl(beginDate, endDate);
		//	WebRequest request = WebRequest.Create(uri);
		//	using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
		//	{
		//		IList&amp;lt;Candle&amp;gt; result = new CandleReader().ReadCandles(sr);
		//		return result;
		//	}
		//}


		#region AddHistoryCandles Загрузка исторических свечек за прошлый день

		/// &amp;lt;summary&amp;gt;
		///  Класс-затычка для хранилища истории
		/// &amp;lt;/summary&amp;gt;
		private class DumbSecurityStorage : ISecurityStorage
		{
			private Security _security;

			public Security LoadBy(string fieldName, object fieldValue)
			{
				return _security;
			}

			public void Save(Security security)
			{
				_security = security;
			}
		}


		Trade ParseTrade(string finamString)
		{
				var culture = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.Name) { NumberFormat = { NumberDecimalSeparator = &amp;quot;.&amp;quot; } };

				var parts = finamString.Split(&amp;#39;,&amp;#39;);
				var trade = new Trade
					{
						Time = DateTime.ParseExact(parts[0] + parts[1], &amp;quot;yyyyMMddHHmmss&amp;quot;, culture),
						Price = decimal.Parse(parts[2], culture),
						Volume = decimal.Parse(parts[3], culture),
						Id = long.Parse(parts[4]),
						Security = Security
					};
				return trade;
				//{
				//	//&amp;lt;DATE&amp;gt;,&amp;lt;TIME&amp;gt;,&amp;lt;LAST&amp;gt;,&amp;lt;VOL&amp;gt;,&amp;lt;ID&amp;gt;
				//	Time = DateTime.ParseExact(parts[0] + parts[1], &amp;quot;yyyyMMddHHmmss&amp;quot;, CultureInfo.InvariantCulture),
				//	Price = decimal.Parse(parts[2], CultureInfo.CurrentCulture),
				//	Volume = decimal.Parse(parts[3], CultureInfo.CurrentCulture),
				//	Id = long.Parse(parts[4]),
				//	Security = Security,
				//};
		}


		/// &amp;lt;summary&amp;gt;
		///  Получение сделок из файла, загруженного вручную с Финама
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;filePath&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		IEnumerable&amp;lt;Trade&amp;gt; GetTradesFromTxt(string filePath)
		{
			var tradeHistory = new List&amp;lt;Trade&amp;gt;();
			if (!File.Exists(filePath))
			{
				return tradeHistory;
			}
			var history = File.ReadAllLines(filePath).Select(ParseTrade);
			return history;
		}


		/// &amp;lt;summary&amp;gt;
		///  Получение сделок с сайта Финама
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;date&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		IEnumerable&amp;lt;Trade&amp;gt; GetTradesFromFinam(DateTime date)
		{
			var storage = new DumbSecurityStorage();
			storage.Save(Security);
			var source = new FinamHistorySource(storage) { DumpFolder = GetTempPath() };
			long finamMarketId;
			Settings.TryGetProperty(&amp;quot;HistoryFinamMarketId&amp;quot;, out finamMarketId);  //14 
			long finamSecurityId;
			Settings.TryGetProperty(&amp;quot;HistoryFinamSecurityId&amp;quot;, out finamSecurityId);  //82813; 
			Security.ExtensionInfo[&amp;quot;FinamMarketId&amp;quot;] = finamMarketId;
			Security.ExtensionInfo[&amp;quot;FinamSecurityId&amp;quot;] = finamSecurityId;
			return source.GetTrades(Security, date);
		}


		/// &amp;lt;summary&amp;gt;
		///  Получение сделок с FTP RTS
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;date&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;loadEvening&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		IEnumerable&amp;lt;Trade&amp;gt; GetTradesFromRts(DateTime date, bool loadEvening = false)
		{
			var storage = new DumbSecurityStorage();
			storage.Save(Security);
			var source = new RtsHistorySource(storage) { DumpFolder = GetTempPath(), LoadEveningSession = loadEvening};
			var trades = new Dictionary&amp;lt;Security, IList&amp;lt;Trade&amp;gt;&amp;gt;();
			source.LoadTrades(date, trades);
			if (!trades.ContainsKey(Security))
				throw new ApplicationException(&amp;quot;Не получены данные за прошлый день&amp;quot;);
			return trades[Security];
		}


		/// &amp;lt;summary&amp;gt;
		///  Папка временных файлов для всех способов загрузки
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		private string GetTempPath()
		{
			var tempPath = Path.Combine(@&amp;quot;E:\TradeStorage\&amp;quot;, &amp;quot;TemporaryFiles&amp;quot;);

			if (!Directory.Exists(tempPath))
				Directory.CreateDirectory(tempPath);

			return tempPath;
		}


		/// &amp;lt;summary&amp;gt;
		///  Получение даты прошлого дня с учётов выходных и праздников 
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;date&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		DateTime GetLastDateBefore(DateTime date)
		{
			do
			{
				date = date.AddDays(-1);
				if (ExchangeBoard.Forts.WorkingTime.IsTradeDate(date, true))
					return date;
			} while (true);
		}


		protected TradeStorageCandleBuilderSource HistorySource;

		/// &amp;lt;summary&amp;gt;
		///  Добавление в список свечей данных из хранилища
		/// &amp;lt;/summary&amp;gt;
		private void AddHistoryCandles()
		{
			try
			{
				this.AddDebugLog(&amp;quot;Загрузка сделок за прошлый день&amp;quot;);
				var storageRegistry = new StorageRegistry();
				string tradeStoragePath;
				Settings.TryGetProperty(&amp;quot;HistoryTradeStoragePath&amp;quot;, out tradeStoragePath);
				((LocalMarketDataDrive) storageRegistry.DefaultDrive).Path = tradeStoragePath;
				var storage = storageRegistry.GetTradeStorage(Security);

				var thisDate = LoggingHelper.Now.Date;
				var lastDate = GetLastDateBefore(thisDate);

				string historySource;
				Settings.TryGetProperty(&amp;quot;HistorySource&amp;quot;, out historySource);
				switch (historySource)
				{
					case &amp;quot;RTS&amp;quot;:
						if (!storage.Dates.Contains(thisDate))
						{
							this.AddDebugLog(&amp;quot;Загрузка сделок с RTS&amp;quot;);
							var trades = GetTradesFromRts(lastDate, true);
							//
							storage.Save(trades.Where(t =&amp;gt; t.Time &amp;gt; lastDate &amp;amp;&amp;amp; t.Price &amp;gt; 0));
							//пропуск закачки более старых (нужна закачка целыми днями) и игнорирование ошибки данных
							// на ftp ртс данные выложены по сессиям с 19.00 до 19.00

							//trades = GetTradesFromRts(thisDate, true);
							//storage.Save(trades.Where(t =&amp;gt; t.Time &amp;lt; thisDate &amp;amp;&amp;amp; t.Price &amp;gt; 0));
							//пропуск закачки сегодняшних и игнорирование ошибки данных
							//todo: обработка ошибок закачки (стратегия останавливается)
						}
						break;
					case &amp;quot;Finam&amp;quot;:
						if (!storage.Dates.Contains(lastDate))
						{
							this.AddDebugLog(&amp;quot;Загрузка сделок с Финама&amp;quot;);
							var trades = GetTradesFromFinam(lastDate);
							storage.Save(trades);
						}
						break;
					default:
						if (!storage.Dates.Contains(lastDate))
						{
							this.AddDebugLog(&amp;quot;Загрузка сделок из файла&amp;quot;);
							//var trades = GetTradesFromTxt(@&amp;quot;E:\Downloads\RIH3_130312_130312.txt&amp;quot;);
							var trades = GetTradesFromTxt(string.Format(
								&amp;quot;{0}{1}_{2}_{2}.txt&amp;quot;,
								tradeStoragePath, Security.Code, lastDate));
							storage.Save(trades);
						}
						break;
				}

				// берём только сделки раньше тех, что есть в таблице
				var lastTimeSource = Trader.Trades.Select(t =&amp;gt; t.Time).ToArray();
				var lastTime = lastTimeSource.Any() ? lastTimeSource.Min() : thisDate;
				HistorySource = new TradeStorageCandleBuilderSource
					{
						StorageRegistry = storageRegistry,
						Filter = trade =&amp;gt; trade.Time &amp;gt; lastDate &amp;amp;&amp;amp; trade.Time &amp;lt; lastTime,
					};
				TraderBuilder.CandleManager.Sources.OfType&amp;lt;TickCandleBuilder&amp;gt;().Single().Sources.Add(HistorySource);
			}
			catch (Exception ex)
			{
				this.AddErrorLog(ex);
			}
		}


		/// &amp;lt;summary&amp;gt;
		///  Очистка памяти от истории за прошлый день.
		/// &amp;lt;/summary&amp;gt;
		protected void DeleteHistory()
		{
			if (HistorySource == null)
				return;
			var source = HistorySource;
			HistorySource = null;
			TraderBuilder.CandleManager.Sources.OfType&amp;lt;TickCandleBuilder&amp;gt;().Single().Sources.Remove(source);
			source.Dispose();
			GC.Collect(2, GCCollectionMode.Forced);
		}

		#endregion

		//readonly object _candleProcessLocker = new object();
		protected override void OnStarted()
		{
			try
			{
				InitSettings();
				Trader = TraderBuilder.BuildTrader();
				OrderHelper = TraderBuilder.OrderHelper;
				if (Trader == null)
					throw new ApplicationException(string.Format(&amp;quot;Отсутствует трейдер {0}.&amp;quot;, TraderBuilder.Title));
				_strategyStartTime = Trader.GetMarketTime(ExchangeBoard.Forts.Exchange);

				Portfolio = PortfolioSelector.GetPortfolio(Trader);
				if (Portfolio == null)
					throw new ApplicationException(string.Format(&amp;quot;Отсутствует портфель {0}.&amp;quot;, PortfolioSelector.Title));

				Security = SecuritySelector.GetSecurity(Trader);
				if (Security == null)
					throw new ApplicationException(string.Format(&amp;quot;Отсутствует инструмент {0}.&amp;quot;, SecuritySelector.Title));
				Trader.RegisterSecurity(Security);

				Trader.RegisterMarketDepth(Security);

				if (VolumeSizer != null)
				{
					Volume = VolumeSizer.GetVolume(Portfolio, Security);
					this.AddInfoLog(&amp;quot;Объем: {0}&amp;quot;, Volume);
				}

				AddHistoryCandles();

				Series = new CandleSeries(
					CandleFrameType, Security, FrameSize) { WorkingTime = ExchangeBoard.Forts.WorkingTime };
					// Если Security - это WeightedIndexSecurity, то _series не заполняется

				Series
					.WhenCandlesFinished()
					.Do(CandleFinishedCall)
					.Sync(Locker)
					.Apply(this);

				TraderBuilder.CandleManager.Start(Series);

				base.OnStarted();

			}
			catch (Exception ex)
			{
				this.AddErrorLog(ex);
				Stop();
			}
		}


		public event Action&amp;lt;Candle&amp;gt; CandleFinished;

		/// &amp;lt;summary&amp;gt;
		///  Свеча сформирована
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;candle&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		private void CandleFinishedCall(Candle candle)
		{
			try
			{
				//todo: померять время
				ProcessCandle(candle);
				if (CandleFinished != null)
					CandleFinished(candle); // стратегия уже должна обработать все индикаторы
			}
			catch (Exception ex)
			{
				this.AddErrorLog(ex);
			}
		}


		protected override void OnStopping()
		{
			//todo: закрытие позиций

			if (Security != null)
				Trader.UnRegisterMarketDepth(Security);
		}


		protected override void OnStopped()
		{
			base.OnStopped();
		}


		protected virtual void ProcessCandle(Candle candle)
		{}

		private decimal _minStepPrice;
		/// &amp;lt;summary&amp;gt;
		///  Получение минимального лота из настроек, потому что соответствующее свойство Security иногда глючит
		/// &amp;lt;/summary&amp;gt;
		public decimal MinStepPrice
		{
			get
			{
				if (_minStepPrice == 0)
				{
					_minStepPrice = MinStepPriceSetting != null
						? MinStepPriceSetting.Value
						: Security.MinStepPrice;
				}
				return _minStepPrice;
			}
		}


		/// &amp;lt;summary&amp;gt;
		///  Получение лучшей цены из стакана (цены изнутри спреда).
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;direction&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		public decimal GetBestInnerPrice(OrderDirections direction)
		{
			var price = direction == OrderDirections.Buy
										? (Security.BestBid != null ? Security.BestBid.Price + MinStepPrice : 0)
										: (Security.BestBid != null ? Security.BestAsk.Price - MinStepPrice : 0);
			return price;
		}


		/// &amp;lt;summary&amp;gt;
		///  Создание и регистрация лимитных заявок в рамках стратегии
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;direction&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;volume&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		protected void SendStrategyOrders(OrderDirections direction, decimal volume)
		{
			try
			{
				CancelActiveOrders(o =&amp;gt; o.Type == OrderTypes.Limit);

				//while (Position != Portfolio.GetPosition() || Orders.Any(o =&amp;gt; o.State == OrderStates.Active))
				//{
				//	this.AddWarningLog(&amp;quot;* Разбег позиций перед сделкой: PositionManager {0} Trader {1}&amp;quot;,
				//		Position, Portfolio.GetPosition());
				//	Thread.Sleep(100);
				//}

				var price = GetBestInnerPrice(direction);
				var order = OrderHelper.CreateLimitOrder(
						Security,
						direction,
						volume,
						price,
						null);

				var newTradesRule = order.WhenNewTrades();
				newTradesRule.Do(OnStrategyTrades).Sync(Locker).Apply();

				TimeCheckProvider.CurrentWaiting = 0;
				this.AddInfoLog(
					&amp;quot;* Новая заявка: Объём {0} Цена {1} Направление {2}&amp;quot;,
					volume, price, direction);
				RegisterOrder(order);
			}
			catch (Exception ex)
			{
				this.AddErrorLog(&amp;quot;* Ошибка регистрации заявки: {0}&amp;quot;, ex);
			}

		}


		/// &amp;lt;summary&amp;gt;
		///  Обработка получения новых сделок
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;trades&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		private void OnStrategyTrades(IEnumerable&amp;lt;MyTrade&amp;gt; trades)
		{
			//todo: логирование новых сделок здесь?
			// возможно стоит создать некий буфер, чтобы логировать и здесь и по событию получения сделок (здесь, наверное, быстрее)
			StopProvider.AddStops(trades);
		}





		public LogManager LogManager { get; set; }

		public IChartPresenter ChartPresenter { get; set; }
	}
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/32821/</id>
    <title type="text">Загрузка из Гидры using System; using System.Collections.Generic; using System.IO; using System.Runt...</title>
    <published>2015-03-10T15:44:59Z</published>
    <updated>2015-03-10T16:00:56Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Загрузка из Гидры&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Storages;
using StockSharp.BusinessEntities;
using StockSharp.Logging;
using Candle = VGn.Robot.Candle;

namespace VGn.Robot
{
	/// &amp;lt;summary&amp;gt;
	///  Класс предварительной подготовки данных
	/// &amp;lt;/summary&amp;gt;
	public class DataLoader : BaseLogReceiver
	{
		LogManager logManager;
		IMarketDataStorage&amp;lt;Trade&amp;gt; tradesStorage;

		Security security;

		public DataLoader()
		{
			
			logManager = new LogManager();
			logManager.Listeners.Add(new FileLogListener(@&amp;quot;c:\candles.log&amp;quot;));
			logManager.Sources.Add(this);

			var path = Path.GetFullPath(@&amp;quot;c:\Hydra\&amp;quot;);

			var storageRegistry = new StorageRegistry
			{
				// изменяем путь, используемый по умолчанию
				DefaultDrive = new LocalMarketDataDrive(path)
			};

			security = GenerateSecurity(); 

			tradesStorage = storageRegistry.GetTradeStorage(security);

		}


		public CandleSeries CreateTimeSeries(TimeSpan frameSize)
		{
			var candleFrame = &amp;quot;TimeFrameCandle&amp;quot;;
			var candleFrameType = Type.GetType(string.Format(&amp;quot;StockSharp.Algo.Candles.{0}, StockSharp.Algo&amp;quot;, candleFrame), true);
			return new CandleSeries(
				candleFrameType, security, frameSize) { WorkingTime = ExchangeBoard.Forts.WorkingTime };
		}




		private static readonly string[] Mounths = { &amp;quot;H&amp;quot;, &amp;quot;M&amp;quot;, &amp;quot;U&amp;quot;, &amp;quot;Z&amp;quot;, }; // последовательность важна для правильной генерации имен фьючерсов
		public const int FIRST_YEAR = 2009;


		//todo: загрузка таблицы дат экспирации из файла
		public Dictionary&amp;lt;int, List&amp;lt;int&amp;gt;&amp;gt; FortsExpirationTable =
			new Dictionary&amp;lt;int, List&amp;lt;int&amp;gt;&amp;gt;()
			{
				{9, new List&amp;lt;int&amp;gt; {13,11,14,14}},
				{10, new List&amp;lt;int&amp;gt; {12,11,15,15}},
				{11, new List&amp;lt;int&amp;gt; {15,15,15,15}},
				{12, new List&amp;lt;int&amp;gt; {15,15,17,17}},
				{13, new List&amp;lt;int&amp;gt; {15,17,16,16}},
				{14, new List&amp;lt;int&amp;gt; {17,16,15,15}},
				{15, new List&amp;lt;int&amp;gt; {16,15,15,15}},
			};


		/// &amp;lt;summary&amp;gt;
		///  Создание склеенного фьючерса RI
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		public ContinuousSecurity GenerateSecurity()
		{
			var prefix = &amp;quot;RI&amp;quot;;
			var securityName = prefix + &amp;quot;@CONTINIOUS&amp;quot;;
			var result = new ContinuousSecurity
			{
				Id = securityName,
				Code = securityName,
				Name = &amp;quot;ContinuousSecurity for &amp;quot; + securityName,
				Board = ExchangeBoard.Forts,
			};
			for (var year = FIRST_YEAR; year &amp;lt; 2015; year++)
			{
				for (var i = 0; i &amp;lt; 4; i++)
				{
					var yearPart = year % 10;      // тут получаем последнюю цифру года
					var mounth = i * 3 + 3;
					var mounthPart = Mounths[i]; // тут выбирается индекс, показывающий месяц

					var id = prefix + mounthPart + yearPart + &amp;quot;@FORTS&amp;quot;;
					var code = prefix + &amp;quot;-&amp;quot; + (yearPart) + &amp;quot;.&amp;quot; + (mounth);
					var security = new Security
					{
						Id = id,
						Code = code,
						Name =
								&amp;quot;ContinuousSecurity for &amp;quot; + prefix + &amp;quot; expiration in &amp;quot; + mounth + &amp;quot;.&amp;quot; +
								year,
						Board = ExchangeBoard.Forts,
					};
					var expiration = new DateTime(year, mounth, FortsExpirationTable[year - 2000][i]);
					result.ExpirationJumps.Add(security, expiration);
				}
			}
			return result;
		}


		/// &amp;lt;summary&amp;gt;
		/// Трансформация свечей в короткую форму 
		/// &amp;lt;/summary&amp;gt;
		public IEnumerable&amp;lt;Candle&amp;gt; TransformCandles(CandleSeries series, DateTime startTime, DateTime stopTime)
		{
			var trades = tradesStorage.Load(startTime, stopTime);
			var id = 1;
			foreach (var candle in trades.ToCandles(series))
			{
				var mycandle = new Candle
				{
					Close = candle.ClosePrice,
					High = candle.HighPrice,
					Id = id++,
					Low = candle.LowPrice,
					Open = candle.OpenPrice,
					Volume = candle.TotalVolume,
					Time = candle.CloseTime
				};
				yield return mycandle;
				//CandleList.Add(mycandle);
			}
			//this.AddInfoLog(&amp;quot;Количество свечек {0}&amp;quot;, CandleList.Count);
			
		}



		/// &amp;lt;summary&amp;gt;
		///  Загрузка готовых свечек из файла
		///  с целью исключения повторного формирования списка свечей
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;fileName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
		public static  T GetFromFile&amp;lt;T&amp;gt;(string fileName) where T : class
		{
			if (!File.Exists(fileName))
				return null;

			//if (File.GetLastWriteTime(fileName).Date.AddDays(1) &amp;lt; DateTime.Now)
			//{
			//	File.Delete(fileName);
			//	return null;
			//}

			using (Stream stream = File.Open(fileName, FileMode.Open))
			{
				var bin = new BinaryFormatter();
				var list = (T)bin.Deserialize(stream);
				return list;
			}
		}


		/// &amp;lt;summary&amp;gt;
		///  Сохранение готовых свечек в файл
		///  с целью исключения повторного формирования списка свечей в тот же день 
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;fileName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		/// &amp;lt;param name=&amp;quot;list&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		public static void WriteToFile&amp;lt;T&amp;gt;(string fileName, T list)
		{
			var v = Path.GetPathRoot(fileName);
			var c = Directory.Exists(v);
			using (Stream stream = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
			{
				var bin = new BinaryFormatter();
				bin.Serialize(stream, list);
			}
		}


	}
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/32818/</id>
    <title type="text">Ребят, что никто не поможет?....</title>
    <published>2015-03-10T14:36:20Z</published>
    <updated>2015-03-10T14:36:20Z</updated>
    <author>
      <name>dron3333</name>
      <uri>https://stocksharp.com/users/73020/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Ребят, что никто не поможет?....</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/32811/</id>
    <title type="text">Всем привет! Только начал разбираться с библиотекой, новичек в общем я. Можете написать простой рабо...</title>
    <published>2015-03-09T15:51:01Z</published>
    <updated>2015-03-09T15:51:01Z</updated>
    <author>
      <name>dron3333</name>
      <uri>https://stocksharp.com/users/73020/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Всем привет! Только начал разбираться с библиотекой, новичек в общем я. Можете написать простой рабочий пример(кусок кода) закачки данных с финама, ну или с другого источника за период ну пусть пару дней по инструменту LKOH. Ну или хотя бы вообще хоть какой-нибудь примерчик. Никак разобраться не получается. Заранее спасибо</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>