﻿<?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/3302/zapazdyvanie-polucheniya-birzhevyh-dannyh-v-kode-odnogo-iz-primerov/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-10T21:11:49Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=3302" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/23547/</id>
    <title type="text">Спасибо, понял. Только вот по ходу написания робота возникло несколько вопросов, напишу здесь, чтобы...</title>
    <published>2013-01-20T19:49:43Z</published>
    <updated>2013-01-20T19:49:43Z</updated>
    <author>
      <name>developer_29</name>
      <uri>https://stocksharp.com/users/16728/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Спасибо, понял.&lt;br /&gt;Только вот по ходу написания робота возникло несколько вопросов, напишу здесь, чтобы не плодить заголовков:&lt;br /&gt;&lt;br /&gt;1 - при подключении к Quik сразу же возникают 2 портфеля, &lt;b&gt;которые я не создавал&lt;/b&gt;. Каким из них пользоваться и если они служат для разных целей, то для каких именно и почему у них такие странные имена?&lt;br /&gt;2 - Как создать заявку, которая просто &lt;b&gt;&amp;quot;сметает&amp;quot;&lt;/b&gt; те предолжения, которые сейчас есть, невзирая на их цену (конечно же, они должны начинаться от лучшего к худшему)? Например, когда пишем &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;

            var order = this.CreateOrder(direction, Security.GetMarketPrice(direction), Volume);

            // регистрируем заявку (обычным способом - лимитированной заявкой)
             RegisterOrder(order);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Затем цена рынка поменялась в ту или иную сторону, меня она в любом случае устраивает, но заявка не выполняется, т.к. цена изменилась, и предложений по цене Security.GetMarketPrice(direction) сейчас нет. Что делать, чтобы в любом случае выполнилась заявка (съела часть стакана, даже если что-то выполнилось по худшей цене)?&lt;br /&gt;3 - Правильно ли я понял, что для закрытия позиции надо совершить противоположную сделку с тем же инструментом (если купил, то потом продать такой же объём)?&lt;br /&gt;4 - Как выставить stop-loss или зафиксировать прибыль: так&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;
// registeredOrder - это ранее зарегистрированная заявка.
trader.CancelOrder(registeredOrder);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;или созданием противоположной заявки, как только цена достигнет того уровня, на который мы ориентируемся?&lt;br /&gt;Под снятием заявки у Вас подразумеваются уже исполненные заявки или те, которые ещё не успели исполниться, но которые по какой-то причине надо снять? Можно ли заранее прописать stop-loss, чтобы сделка &lt;b&gt;автоматически&lt;/b&gt; закрывалась, как только цена достигнет определённного уровня?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23473/</id>
    <title type="text">S# просто запускает OnProcess раз в timeframe. Всё что выполняется далее зависит от того что написан...</title>
    <published>2013-01-15T19:40:04Z</published>
    <updated>2013-01-15T19:40:04Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">S# просто запускает OnProcess раз в timeframe.&lt;br /&gt;Всё что выполняется далее зависит от того что написано в OnProcess.&lt;br /&gt; Если у вас там написано слать заявки на каждый вызов - он будет слать заявки и в клиринг, и ночью.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23464/</id>
    <title type="text"> Он берёт время когда вы создаёте и запускаете стратегию и дальше делает +5 минут. Хотите чтоб чаще ...</title>
    <published>2013-01-15T18:48:19Z</published>
    <updated>2013-01-15T18:48:19Z</updated>
    <author>
      <name>developer_29</name>
      <uri>https://stocksharp.com/users/16728/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Alexander Mukhanchikov &lt;a href="https://stocksharp.com/posts/m/23460/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Он берёт время когда вы создаёте и запускаете стратегию и дальше делает +5 минут.&lt;br /&gt;Хотите чтоб чаще срабатывал OnProcess - задайте Interval.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Спасибо, с данным вопросом разобрался, буду разбираться с остальными.&lt;br /&gt;&lt;br /&gt;И ещё: торги начинаются в 10-00, а если я запущу вышенаписанный код в 9-00 (и пойду по делам), то он просто будет ждать начала торгов, а затем нормально отработает весь день (если ничего не портить и не ломать)? Иными словами, есть ли необходимость самостоятельно дописывать код, чтобы он &amp;quot;включался самостоятельно&amp;quot; к началу торгов или это уже учтено?&lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23460/</id>
    <title type="text">Вы используете таймфрейм стратегию, вызов OnProcess просто срабатывает раз в 5 минут. Никто не обеща...</title>
    <published>2013-01-15T18:09:14Z</published>
    <updated>2013-01-15T18:09:14Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Вы используете таймфрейм стратегию, вызов OnProcess просто срабатывает раз в 5 минут. Никто не обещает что он срабатывает именно в 11-00, 11-05 и т.д.&lt;br /&gt;Он берёт время когда вы создаёте и запускаете стратегию и дальше делает +5 минут.&lt;br /&gt;Хотите чтоб чаще срабатывал OnProcess - задайте Interval.&lt;br /&gt;&lt;br /&gt;P.S. Я не основатель :)</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23450/</id>
    <title type="text"> У вас код System.IO.File.AppendAllText(@&amp;quot;D:\temp.txt&amp;quot;, Security.BestAsk + &amp;quot;\t\t&amp;quot; + Security.BestBid...</title>
    <published>2013-01-15T16:54:43Z</published>
    <updated>2013-01-15T16:54:43Z</updated>
    <author>
      <name>developer_29</name>
      <uri>https://stocksharp.com/users/16728/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Alexander Mukhanchikov &lt;a href="https://stocksharp.com/posts/m/23448/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;У вас код&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;
System.IO.File.AppendAllText(@&amp;quot;D:\temp.txt&amp;quot;, Security.BestAsk + &amp;quot;\t\t&amp;quot; + Security.BestBid + &amp;quot;\r\n&amp;quot;);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;будет выполняться не чаще чем каждые 5 минут - когда вызывается OnProcess. Может выполняться и реже - когда сработал один из return до этого года.&lt;br /&gt;&lt;br /&gt;Т.е. он может выполняться и раз в 15 минут, и раз в 5 минут - всё зависит от условий до вышего вывода.&lt;br /&gt;&lt;br /&gt;Что вы ожидаете от этого кода?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Код выполняется не в 11-00, 11-05, 11-10 и т.д., а в 11-01, 11-06, 11-11 соответственно. Т.е., срабатывает примерно на минуты полторы позже, чем положено, причём -- каждый раз на полторы минуты позже, чем положено. Время на моём компьютере с точностью до нескольких секунд совпадает со временем Quik.&lt;br /&gt;Я ожидаю от кода, что запись будет происходить в 11-00, 11-05, 11-10 и т.д, а не в 11-01, 11-06, 11-11, как у меня сейчас.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Alexander Mukhanchikov&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Так Вы тот самый основатель, если верить нику! Слушал Ваше интервью на youtube ещё до подробного знакомства с S#.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23448/</id>
    <title type="text">C чего взяли что задержка? Как часто вызывается OnProcess? Я и пытаюсь выяснить, в связи с чем она, ...</title>
    <published>2013-01-15T16:38:15Z</published>
    <updated>2013-01-15T16:38:15Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;developer_29 &lt;a href="https://stocksharp.com/posts/m/23447/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;C чего взяли что задержка? Как часто вызывается OnProcess?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Я и пытаюсь выяснить, в связи с чем она, записи же происходят раз в пять минут, как и положено стртегии на 5-минутных свечах, только вот происходят они с запаздыванием в полторы минуты почему-то.&lt;br /&gt;&lt;br /&gt;А управление в свою очередь производится из этого кода, я оттуда удалил ни на что не влияющую прорисовку свечей. Код весь взят из SampleSMA, который находится у Вас на сайте stocksharp.com&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Что именно происходит с запаздыванием в 1.5 минуты?&lt;br /&gt;&lt;br /&gt;У вас код&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;
System.IO.File.AppendAllText(@&amp;quot;D:\temp.txt&amp;quot;, Security.BestAsk + &amp;quot;\t\t&amp;quot; + Security.BestBid + &amp;quot;\r\n&amp;quot;);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;будет выполняться не чаще чем каждые 5 минут - когда вызывается OnProcess. Может выполняться и реже - когда сработал один из return до этого года.&lt;br /&gt;&lt;br /&gt;Т.е. он может выполняться и раз в 15 минут, и раз в 5 минут - всё зависит от условий до вышего вывода.&lt;br /&gt;&lt;br /&gt;Что вы ожидаете от этого кода?&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23447/</id>
    <title type="text">C чего взяли что задержка? Как часто вызывается OnProcess? Я и пытаюсь выяснить, в связи с чем она, ...</title>
    <published>2013-01-15T16:31:33Z</published>
    <updated>2013-01-15T16:33:45Z</updated>
    <author>
      <name>developer_29</name>
      <uri>https://stocksharp.com/users/16728/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;C чего взяли что задержка? Как часто вызывается OnProcess?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Я и пытаюсь выяснить, в связи с чем она, записи же происходят раз в пять минут, как и положено стртегии на 5-минутных свечах, только вот происходят они с запаздыванием в полторы минуты почему-то.&lt;br /&gt;&lt;br /&gt;А управление в свою очередь производится из этого кода, я оттуда удалил ни на что не влияющую прорисовку свечей. Код весь взят из SampleSMA, который находится у Вас на сайте stocksharp.com&lt;br /&gt;&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;
namespace SampleSMA
{
	using System;
	using System.Collections.Generic;
	using System.Diagnostics;
	using System.Linq;
	using System.ComponentModel;
	using System.Globalization;
	using System.IO;
	using System.Threading;
	using System.Windows;
	using System.Windows.Forms;
	using MessageBox = System.Windows.MessageBox;

	using AmCharts.Windows.Stock;

	using Ecng.Collections;
	using Ecng.Common;
	using Ecng.Xaml;
	using Ecng.ComponentModel;

	using StockSharp.Algo.Logging;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Reporting;
	using StockSharp.Algo.Strategies;
	using StockSharp.Algo.Indicators;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.BusinessEntities;
	using StockSharp.Quik;
	using StockSharp.Xaml;

	public partial class MainWindow
	{
		private readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
		private QuikTrader _trader;
		private SmaStrategy _strategy;
		private bool _isDdeStarted;
		private DateTime _lastCandleTime;
		private bool _isTodaySmaDrawn;
		private CandleManager _candleManager;
		private readonly ICollection&amp;lt;CustomChartIndicator&amp;gt; _longSmaGraph;
		private readonly ICollection&amp;lt;CustomChartIndicator&amp;gt; _shortSmaGraph;
		private Security _lkoh;

		public MainWindow()
		{
			InitializeComponent();

			// изменяет текущий формат, чтобы нецелое числа интерпритировалось как разделенное точкой.
			var cci = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name) { NumberFormat = { NumberDecimalSeparator = &amp;quot;.&amp;quot; } };
			Thread.CurrentThread.CurrentCulture = cci;

			_longSmaGraph = _chart.CreateTrend(&amp;quot;Длинная&amp;quot;, GraphType.Line);
			_shortSmaGraph = _chart.CreateTrend(&amp;quot;Короткая&amp;quot;, GraphType.Line);
		}

		private void _orders_OrderSelected(object sender, EventArgs e)
		{
			CancelOrders.IsEnabled = !_orders.SelectedOrders.IsEmpty();
		}

		protected override void OnClosing(CancelEventArgs e)
		{
			if (_trader != null)
			{
				if (_isDdeStarted)
					StopDde();

				_trader.Dispose();
			}

			base.OnClosing(e);
		}

		private void FindPath_Click(object sender, RoutedEventArgs e)
		{
			var dlg = new FolderBrowserDialog();

			if (!Path.Text.IsEmpty())
				dlg.SelectedPath = Path.Text;

			if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				Path.Text = dlg.SelectedPath;
			}
		}

		private void Connect_Click(object sender, RoutedEventArgs e)
		{
			if (_trader == null || !_trader.IsConnected)
			{
				if (_trader == null)
				{
					if (Path.Text.IsEmpty())
					{
						//MessageBox.Show(this, &amp;quot;Путь к Quik не выбран.&amp;quot;);
						//return;
                        Path.Text = @&amp;quot;c:\BCS_Work\QUIK&amp;quot;;
					}

					// создаем шлюз
					_trader = new QuikTrader(Path.Text);

					Portfolios.Trader = _trader;

					_trader.Connected += () =&amp;gt;
					{
						_candleManager = new CandleManager(_trader);
						foreach (var builder in _candleManager.Sources.OfType&amp;lt;CandleBuilder&amp;gt;())
						{
							builder.IsSyncRegister = true;
						}

						_trader.NewSecurities += securities =&amp;gt; this.GuiAsync(() =&amp;gt;
						{
							// находим нужную бумагу
							var lkoh = securities.FirstOrDefault(s =&amp;gt; s.Code == &amp;quot;RIH3&amp;quot;);

							if (lkoh != null)
							{
								_lkoh = lkoh;

								this.GuiAsync(() =&amp;gt;
								{
									Start.IsEnabled = true;
								});
							}
						});

						_trader.NewMyTrades += trades =&amp;gt; this.GuiAsync(() =&amp;gt;
						{
							if (_strategy != null)
							{
								// найти те сделки, которые совершила стратегия скользящей средней
								trades = trades.Where(t =&amp;gt; _strategy.Orders.Any(o =&amp;gt; o == t.Order));

								_trades.Trades.AddRange(trades);
							}
						});

						_candleManager.CandlesStarted += (token, candles) =&amp;gt;
						{
						};
						//_trader.ProcessDataError += ex =&amp;gt; this.Sync(() =&amp;gt; MessageBox.Show(this, ex.ToString()));
						_trader.ConnectionError += ex =&amp;gt;
						{
							if (ex != null)
								this.GuiAsync(() =&amp;gt; MessageBox.Show(this, ex.ToString()));
						};

						this.GuiAsync(() =&amp;gt;
						{
							ConnectBtn.IsEnabled = false;
							ExportDde.IsEnabled = true;
							Report.IsEnabled = true;
						});
					};
				}

				_trader.Connect();
			}
			else
				_trader.Disconnect();
		}

		private void OnNewOrder(Order order)
		{
			_orders.Orders.Add(order);
			this.GuiAsync(() =&amp;gt; _chart.Orders.Add(order));
		}

		private void OnLog(LogMessage message)
		{
			// если стратегия вывела не просто сообщение, то вывести на экран.
			if (message.Type != ErrorTypes.None)
				this.GuiAsync(() =&amp;gt; MessageBox.Show(this, message.Message));
		}

		private void DrawSma1()
		{
			// нас не интересует текущая свечка, так как она еще не сформировалась
			// и из нее нельзя брать цену закрытия

			// вычисляем временные отрезки текущей свечки
			var bounds = _timeFrame.GetCandleBounds(_trader);

			// если появились новые полностью сформированные свечки
			if ((_lastCandleTime + _timeFrame) &amp;lt; bounds.Min)
			{
				// отступ с конца интервала, чтобы не захватить текущую свечку.
				var endOffset = TimeSpan.FromSeconds(1);

				bounds = new Range&amp;lt;DateTime&amp;gt;(_lastCandleTime + _timeFrame, bounds.Min - endOffset);

				// получаем эти свечки
				var candles = _candleManager.GetTimeFrameCandles(_strategy.Security, _timeFrame, bounds);

				if (!candles.IsEmpty())
				{
					foreach (var candle in candles)
					{
						// добавляем новую свечку
						_strategy.LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);
						_strategy.ShortSma.Process((DecimalIndicatorValue)candle.ClosePrice);
					}

					// получаем время самой последней свечки и запоминаем его как новое начало
					_lastCandleTime = candles.Max(c =&amp;gt; c.Time);
				}
			}
		}

		private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e)
		{
			this.GuiAsync(() =&amp;gt;
			{
				Status.Content = _strategy.ProcessState;
				PnL.Content = _strategy.PnLManager.PnL;
				Slippage.Content = _strategy.SlippageManager.Slippage;
				Position.Content = _strategy.PositionManager.Position;
				Latency.Content = _strategy.LatencyManager.Latency;
			});
		}

		private void StartDde()
		{
			_trader.StartExport();
			_isDdeStarted = true;
		}

		private void StopDde()
		{
			_trader.StopExport();
			_isDdeStarted = false;
		}

		private void ExportDde_Click(object sender, RoutedEventArgs e)
		{
			if (_isDdeStarted)
				StopDde();
			else
				StartDde();
		}

		private void CancelOrders_Click(object sender, RoutedEventArgs e)
		{
			_orders.SelectedOrders.ForEach(_trader.CancelOrder);
		}

		private void Start_Click(object sender, RoutedEventArgs e)
		{
			if (_strategy == null)
			{
				if (Portfolios.SelectedPortfolio == null)
				{
					MessageBox.Show(this, &amp;quot;Портфель не выбран.&amp;quot;);
					return;
				}

				var candles = File.ReadAllLines(&amp;quot;LKOH_history.txt&amp;quot;).Select(line =&amp;gt;
				{
				    var parts = line.Split(&amp;#39;,&amp;#39;);
				    var time = DateTime.ParseExact(parts[0] + parts[1], &amp;quot;yyyyMMddHHmmss&amp;quot;, CultureInfo.InvariantCulture);
				    return new TimeFrameCandle
				    {
				        OpenPrice = parts[2].To&amp;lt;decimal&amp;gt;(),
				        HighPrice = parts[3].To&amp;lt;decimal&amp;gt;(),
				        LowPrice = parts[4].To&amp;lt;decimal&amp;gt;(),
				        ClosePrice = parts[5].To&amp;lt;decimal&amp;gt;(),
				        TimeFrame = _timeFrame,
				        Time = time,
						TotalVolume = parts[6].To&amp;lt;decimal&amp;gt;(),
				        Security = _lkoh,
				    };
				});

				// создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
				_strategy = new SmaStrategy(_candleManager, new SimpleMovingAverage { Length = 80 }, new SimpleMovingAverage { Length = 10 }, _timeFrame)
				{
					Volume = 1,
					Security = _lkoh,
					Portfolio = Portfolios.SelectedPortfolio,
					Trader = _trader,
				};
				_strategy.Log += OnLog;
				_strategy.NewOrder += OnNewOrder;
				_strategy.PropertyChanged += OnStrategyPropertyChanged;

				var index = 0;

				// начинаем вычислять скользящие средние
				foreach (var candle in candles)
				{
				    _strategy.LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);
				    _strategy.ShortSma.Process((DecimalIndicatorValue)candle.ClosePrice);

				    index++;

				    _lastCandleTime = candle.Time;
				}

				// регистрируем наш тайм-фрейм
				_candleManager.RegisterTimeFrameCandles(_lkoh, _timeFrame);

				// вычисляем временные отрезки текущей свечки
				var bounds = _timeFrame.GetCandleBounds(_trader);

				candles = _candleManager.GetTimeFrameCandles(_strategy.Security, _timeFrame, new Range&amp;lt;DateTime&amp;gt;(_lastCandleTime + _timeFrame, bounds.Min));

				foreach (var candle in candles)
				{
					_strategy.LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);
					_strategy.ShortSma.Process((DecimalIndicatorValue)candle.ClosePrice);

					_lastCandleTime = candle.Time;
				}

				_isTodaySmaDrawn = true;

				Report.IsEnabled = true;
			}

			if (_strategy.ProcessState == ProcessStates.Stopped)
			{
				// запускаем процесс получения стакана, необходимый для работы алгоритма котирования
				_trader.RegisterQuotes(_strategy.Security);
				_strategy.Start();
				Start.Content = &amp;quot;Стоп&amp;quot;;
			}
			else
			{
				_trader.UnRegisterQuotes(_strategy.Security);
				_strategy.Stop();
				Start.Content = &amp;quot;Старт&amp;quot;;
			}
		}

		private void Report_Click(object sender, RoutedEventArgs e)
		{
			// сгерерировать отчет по прошедшему тестированию
			new ExcelStrategyReport(_strategy, &amp;quot;sma.xls&amp;quot;).Generate();

			// открыть отчет
			Process.Start(&amp;quot;sma.xls&amp;quot;);
		}
	}
}&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/23446/</id>
    <title type="text">C чего взяли что задержка? Как часто вызывается OnProcess?</title>
    <published>2013-01-15T16:30:30Z</published>
    <updated>2013-01-15T16:30:30Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">C чего взяли что задержка? Как часто вызывается OnProcess?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23445/</id>
    <title type="text"> Показывайте код, где и как вы делает сохранение, чтобы не приходилось догадываться. Телепаты в отпу...</title>
    <published>2013-01-15T16:28:34Z</published>
    <updated>2013-01-15T16:28:34Z</updated>
    <author>
      <name>developer_29</name>
      <uri>https://stocksharp.com/users/16728/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Moadip &lt;a href="https://stocksharp.com/posts/m/23415/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Показывайте код, где и как вы делает сохранение, чтобы не приходилось догадываться.&lt;br /&gt;Телепаты в отпуске.[smile]&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&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;
namespace SampleSMA
{
	using System;

	using StockSharp.Algo;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.Algo.Strategies;
	using StockSharp.BusinessEntities;

	class SmaStrategy : TimeFrameStrategy
	{
		private readonly CandleManager _candleManager;
		private bool _isShortLessThenLong;

		private DateTime _nextTime;

		public SmaStrategy(CandleManager candleManager, SimpleMovingAverage longSma, SimpleMovingAverage shortSma, TimeSpan timeFrame)
			: base(timeFrame)
		{
			_candleManager = candleManager;

			LongSma = longSma;
			ShortSma = shortSma;
		}

		public SimpleMovingAverage LongSma { get; private set; }
		public SimpleMovingAverage ShortSma { get; private set; }

		protected override void OnStarting()
		{
			// запоминаем текущее положение относительно друг друга
			_isShortLessThenLong = ShortSma.LastValue &amp;lt; LongSma.LastValue;

			// вычисляем время окончания текущей пятиминутки
			_nextTime = TimeFrame.GetCandleBounds(Trader).Max;

			base.OnStarting();
		}

		protected override ProcessResults OnProcess()
		{
			// если наша стратегия в процессе остановки
			if (ProcessState == ProcessStates.Stopping)
			{
				// отменяем активные заявки
				CancelActiveOrders();

				// так как все активные заявки гарантированно были отменены, то возвращаем ProcessResults.Stop
				return ProcessResults.Stop;
			}

			// событие обработки торговой стратегии вызвалось впервый раз, что раньше, чем окончания текущей 5-минутки.
			if (Trader.MarketTime &amp;lt; _nextTime)
			{
				// возвращаем ProcessResults.Continue, так как наш алгоритм еще не закончил свою работу, а просто ожидает следующего вызова.
				return ProcessResults.Continue;
			}

			// получаем сформированную свечку
			var candle = _candleManager.GetTimeFrameCandle(Security, TimeFrame, _nextTime - TimeFrame);

			// если свечки не существует (не было ни одной сделке в тайм-фрейме), то ждем окончания следующей свечки.
			if (candle == null)
			{
				// если прошло больше 10 секунд с момента окончания свечки, а она так и не появилась,
				// значит сделок в прошедшей 5-минутке не было, и переходим на следующую свечку
				if ((Trader.MarketTime - _nextTime) &amp;gt; TimeSpan.FromSeconds(10))
					_nextTime = TimeFrame.GetCandleBounds(Trader.MarketTime).Max;

				return ProcessResults.Continue;
			}

			_nextTime += TimeFrame;

			// вычисляем новое положение относительно друг друга
			var isShortLessThenLong = ShortSma.LastValue &amp;lt; LongSma.LastValue;

            // Вот здесь и происходить сохранение
            System.IO.File.AppendAllText(@&amp;quot;D:\temp.txt&amp;quot;, Security.BestAsk + &amp;quot;\t\t&amp;quot; + Security.BestBid + &amp;quot;\r\n&amp;quot;);

			return ProcessResults.Continue;
		}
	}
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23415/</id>
    <title type="text">Если хотите получить ответ на вопрос, пишите максимум информации. Показывайте код, где и как вы дела...</title>
    <published>2013-01-15T06:14:06Z</published>
    <updated>2013-01-15T06:40:59Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.com/users/5973/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Если хотите получить ответ на вопрос, пишите максимум информации.&lt;br /&gt;Показывайте код, где и как вы делает сохранение, чтобы не приходилось догадываться.&lt;br /&gt;Телепаты в отпуске.[smile] &lt;br /&gt;&lt;br /&gt;UPD: Создавайте темы в соответствующих разделах. К разделу &lt;b&gt;Обучение программированию роботов&lt;/b&gt; ваш вопрос отношения не имеет.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/23411/</id>
    <title type="text"> Здравствуйте. Недавно начал ознакамливаться с документацией S# (для Quik), в основном осталось поло...</title>
    <published>2013-01-14T20:20:26Z</published>
    <updated>2013-01-14T20:20:26Z</updated>
    <author>
      <name>developer_29</name>
      <uri>https://stocksharp.com/users/16728/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">   Здравствуйте.&lt;br /&gt;   Недавно начал ознакамливаться с документацией S# (для Quik), в основном осталось положительное впечатление. &lt;br /&gt;   Но в примере SampleSMA из документации я дописал к стратегии код, который перед каждой проверкой на пересечение &lt;br /&gt;(строчка if (_isShortLessThenLong != isShortLessThenLong)) должен записывать в файл значения Bid и Ask. Свечи используются 5-минутные, но запись ведётся с запозданием примерно в полторы минуты. Соединение нормальное, время на компьютере и время на бирже совпадают, в Quik данные приходят вовремя, запаздывание одинаковое от свечки к свечке. С чем это связано и как это исправить?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>