﻿<?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/2444/ispolzovanie-stakana-pri-testirovanii/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-05-03T05:29:37Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=2444" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/16896/</id>
    <title type="text">Честно - ХЗ почему не работает. Я бы взял один из примеров и потишоньку бы передолываал его под себя...</title>
    <published>2012-03-02T12:45:43Z</published>
    <updated>2012-03-02T12:45:43Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.com/users/6032/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;vader &lt;a href="https://stocksharp.com/posts/m/16885/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Честно - ХЗ почему не работает.&lt;br /&gt;&lt;br /&gt;Я бы взял один из примеров и потишоньку бы передолываал его под себя, тогда будет видна причина ошибки.&lt;br /&gt;И Станет понятен мехнизм работы S#.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Да я вроде так и делаю, лан) начну сначала.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16885/</id>
    <title type="text">Честно - ХЗ почему не работает. Я бы взял один из примеров и потишоньку бы передолываал его под себя...</title>
    <published>2012-03-02T09:11:49Z</published>
    <updated>2012-03-02T09:11:49Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Честно - ХЗ почему не работает.&lt;br /&gt;&lt;br /&gt;Я бы взял один из примеров и потишоньку бы передолываал его под себя, тогда будет видна причина ошибки.&lt;br /&gt;И Станет понятен мехнизм работы S#.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16877/</id>
    <title type="text">Покажи место, где происходит инициализация стакана. Trader.QuotesChanged += depths =&amp;gt; { _marketDepth...</title>
    <published>2012-03-01T14:00:07Z</published>
    <updated>2012-03-01T14:00:07Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.com/users/6032/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;vader &lt;a href="https://stocksharp.com/posts/m/16875/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Покажи место, где происходит инициализация стакана.&lt;/div&gt;&lt;/div&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;
Trader.QuotesChanged += depths =&amp;gt;
            {
                _marketDepth = depths.FirstOrDefault(d =&amp;gt; d.Security == Security);
            };&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/16875/</id>
    <title type="text">Покажи место, где происходит инициализация стакана.</title>
    <published>2012-03-01T12:35:56Z</published>
    <updated>2012-03-01T12:41:49Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</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/16874/</id>
    <title type="text">В общем сделал вот так. mainwindow.xaml.cs namespace SampleHistoryTesting { using System; using Syst...</title>
    <published>2012-03-01T12:31:45Z</published>
    <updated>2012-03-01T12:31:45Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.com/users/6032/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">В общем сделал вот так.&lt;br /&gt;&lt;br /&gt;mainwindow.xaml.cs&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 SampleHistoryTesting
{
	using System;
	using System.Collections.Generic;
	using System.Diagnostics;
	using System.IO;
	using System.Windows;
	using System.Windows.Forms;
	using System.Windows.Media;
	using MessageBox = System.Windows.MessageBox;

	using Ecng.Common;
	using Ecng.Serialization;
	using Ecng.Xaml;
	using Ecng.Collections;

	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Reporting;
	using StockSharp.Algo.Storages;
	using StockSharp.Algo.Strategies;
	using StockSharp.Algo.Testing;
	using StockSharp.Algo.Logging;
	using StockSharp.Algo.Equity;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.BusinessEntities;
	
	public partial class MainWindow
	{
		private Strategy _strategy;

		private ICollection&amp;lt;EquityData&amp;gt; _curveItems;
		private EmulationTrader _trader;

		private readonly LogManager _logManager = new LogManager();

		private DateTime _lastUpdateDate;
		private DateTime _startEmulationTime;

		public MainWindow()
		{
			InitializeComponent();

			_logManager.Listeners.Add(new FileLogListener(&amp;quot;log.txt&amp;quot;));
		}

		private void FindPath_Click(object sender, RoutedEventArgs e)
		{
			var dlg = new FolderBrowserDialog();

			if (!HistoryPath.Text.IsEmpty())
				dlg.SelectedPath = HistoryPath.Text;

			if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				HistoryPath.Text = dlg.SelectedPath;
			}
		}

		private void StartBtn_Click(object sender, RoutedEventArgs e)
		{
			// если процесс был запущен, то его останавливаем
			if (_trader != null &amp;amp;&amp;amp; _trader.State != EmulationStates.Stopped)
			{
				StartBtn.IsEnabled = false;

				_strategy.Stop();
				_trader.Stop();
				_logManager.Sources.Clear();

				return;
			}

			if (HistoryPath.Text.IsEmpty() || !Directory.Exists(HistoryPath.Text))
			{
				MessageBox.Show(this, &amp;quot;Неправильный путь.&amp;quot;);
				return;
			}

			// создаем тестовый инструмент, на котором будет производится тестирование
			var security = new Security
			{
				Id = &amp;quot;RIH2@RTS&amp;quot;, // по идентификатору инструмента будет искаться папка с историческими маркет данными
				Code = &amp;quot;RIH2&amp;quot;,
				Name = &amp;quot;RTS-3.12&amp;quot;,
				MinStepSize = 5,
				MinStepPrice = 2,
				Exchange = Exchange.Test,
			};

			// тестовый портфель
			var portfolio = new Portfolio { Name = &amp;quot;test account&amp;quot;, BeginAmount = 1000000m };

			// хранилище, через которое будет производиться доступ к тиковой и котировочной базе
			var storage = new TradingStorage(new InMemoryStorage())
			{
				BasePath = HistoryPath.Text
			};

			var timeFrame = TimeSpan.FromMinutes(5);

			// в реальности период может быть другим, и это зависит от объема данных,
			// хранящихся по пути HistoryPath, 
			var startTime = new DateTime(2012, 2, 27);
            var stopTime = new DateTime(2012, 2, 28);
	
			_trader = new EmulationTrader(
				new[] { security },
				new[] { portfolio })
			{
				MarketTimeChangedInterval = timeFrame,
				Storage = storage,
				WorkingTime = Exchange.Rts.WorkingTime,

				// параметр влияет на занимаемую память.
				// в случае достаточно количества памяти на компьютере рекомендуется его увеличить
				DaysInMemory = 6,
			};
			
			_trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security)
			{
				// стакан для инструмента в истории обновляется раз в секунду
				Interval = TimeSpan.FromSeconds(1),
			};

			var candleManager = new CandleManager();
			var builder = new CandleBuilder(new TradeCandleBuilderSource(_trader) { IsSyncProcess = true });
			candleManager.Sources.Add(builder);

			// в целях оптимизации расходования памяти храним не более 100 последних свечек и 100000 последних сделок
			((CandleContainer)candleManager.Container).MaxCandleCount = 100;
			((CandleBuilderContainer)builder.Container).MaxCandleCount = 100;
			((CandleBuilderContainer)builder.Container).MaxValueCount = 100000;

			candleManager.RegisterTimeFrameCandles(security, timeFrame);

			// создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
            _strategy = new NewStrategy()
			{
				Volume = 1,
				Portfolio = portfolio,
				Security = security,
				Trader = _trader
			};

			// копируем параметры на визуальную панель
			ParametersPanel.Parameters.Clear();
			ParametersPanel.Parameters.AddRange(_strategy.EquityManager.Parameters);

			if (_curveItems == null)
				_curveItems = Curve.CreateCurve(_strategy.Name, Colors.DarkGreen);
			else
				_curveItems.Clear();

			_strategy.EquityManager.NewEquityData += data =&amp;gt; this.GuiAsync(() =&amp;gt; _curveItems.Add(data));

			_logManager.Sources.Add(_strategy);

			// и подписываемся на событие изменения времени, чтобы обновить ProgressBar
			_trader.MarketTimeChanged += () =&amp;gt;
			{
				// в целях оптимизации обновляем ProgressBar только при начале нового дня
				if (_trader.MarketTime.Date != _lastUpdateDate || _trader.MarketTime &amp;gt;= stopTime)
				{
					_lastUpdateDate = _trader.MarketTime.Date;
					this.GuiAsync(() =&amp;gt; TestingProcess.Value = (_trader.MarketTime - startTime).Ticks);
				}
			};

			_trader.StateChanged += () =&amp;gt;
			{
				if (_trader.State == EmulationStates.Stopped)
				{
					this.GuiAsync(() =&amp;gt;
					{
						StartBtn.IsEnabled = true;

						if (TestingProcess.Value == TestingProcess.Maximum)
							MessageBox.Show(&amp;quot;Закончено за &amp;quot; + (DateTime.Now - _startEmulationTime));
						else
							MessageBox.Show(&amp;quot;Отменено&amp;quot;);
					});
				}
				else if (_trader.State == EmulationStates.Started)
				{
					// запускаем стратегию когда эмулятор запустился
					_strategy.Start();
				}
			};

			// устанавливаем в визуальный элемент ProgressBar максимальное количество итераций)
			TestingProcess.Maximum = (stopTime - startTime).Ticks;
			TestingProcess.Value = 0;
			Report.IsEnabled = true;

			_startEmulationTime = DateTime.Now;

			// соединяемся с трейдером и запускаем экспорт,
			// чтобы инициализировать переданными инструментами и портфелями необходимые свойства EmulationTrader
			_trader.Connect();
			_trader.StartExport();

			// запускаем эмуляцию, задавая период тестирования (startTime, stopTime).
			_trader.Start(startTime, stopTime);
		}

		private void Report_Click(object sender, RoutedEventArgs e)
		{
			// сгерерировать отчет по прошедшему тестированию
			// Внимание! сделок и заявок может быть большое количество,
			// поэтому Excel отчет может тормозить
			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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;strategy.cs&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 SampleHistoryTesting
{
	using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;

    using Ecng.Common;
    using Ecng.Collections;

	using StockSharp.Algo;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.Algo.Strategies;
	using StockSharp.BusinessEntities;

    public class NewStrategy : Strategy
    {
        static int pos = 2; // 0 - buy; 1 - sell
        static decimal posPrice = 0;
        static long posId;
        int i;
        protected override void OnStarting()
        {
            this
                .When(Security.MarketDepthChanged())
                .Do(str);

            base.OnStarting();
        }

        private static MarketDepth _marketDepth;
        private static Position _position;

        public void str()
        {
            Trader.QuotesChanged += depths =&amp;gt;
            {
                _marketDepth = depths.FirstOrDefault(d =&amp;gt; d.Security == Security);
            };

            Trader.NewPositions += positions =&amp;gt;
            {
                if (_position == null)
                {
                    _position = positions.FirstOrDefault();
                }
            };

            Trader.NewOrders += myTrades =&amp;gt;
            {
                foreach (var myTrade in myTrades)
                {
                    var trade = myTrade;
                    //Console.WriteLine(&amp;quot;Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.{5}&amp;quot;, trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time, trade.Direction);
                    int _pos = (int)trade.Direction;
                    if (posPrice == trade.Price &amp;amp;&amp;amp; pos == _pos)
                    {
                        posId = trade.Id;
                    }
                }
            };

            var totb = _marketDepth.TotalBidsVolume;// общий объем покупки
            var tota = _marketDepth.TotalAsksVolume;// общий объем продажи

            if (_position.CurrentValue != 0) // если позиция не равна 0, то будем считать, что заявок у нас нету
            {
                i = 0;
            }

            if (i == 1) // если заявка есть, то...
            {
                if ((Security.BestBid.Price - posPrice &amp;gt;= 50 &amp;amp;&amp;amp; pos == 0) || (posPrice - Security.BestAsk.Price &amp;gt;= 50 &amp;amp;&amp;amp; pos == 1)) // если цена ушла от заявки на 50 и более пунктов то закрываем ее
                {
                    var orderClose = Trader.Orders.First(o =&amp;gt; o.Id == posId);

                    /* получаем статус заявки */
                    int stateOrderClose = (int)orderClose.State;
                    /*
                     * 0 - Не отправлена в торговую систему.
                     * 1 - Заявка принята биржей и активна.
                     * 2 - Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы). 
                     * 3 - Заявка не принята торговой системой.
                    */

                    if (stateOrderClose == 1)
                    {
                        Trader.CancelOrder(orderClose);
                    }
                    if (stateOrderClose == 2)
                    {
                        i = 0;
                    }
                }
            }

            if (_position.CurrentValue == 0 &amp;amp;&amp;amp; i == 0)
            {
                if (totb &amp;gt; tota) // если общий объем покупок больше продаж, то продаем
                {
                    i = 1;
                    shortPos();
                }
                else
                {
                    i = 1;
                    longPos();
                }
            }
        }

        public void longPos()
        {
            // создаем заявку для открытия длинной позиции
            var longPos = new Order
            {
                Portfolio = Portfolio,
                Price = Security.ShrinkPrice(Security.BestBid.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Buy,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(longPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() =&amp;gt; longPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(longPos);
            pos = 0;
            posPrice = Security.BestBid.Price;
        }

        public void shortPos()
        {
            // создаем заявку для открытия длинной позиции
            var shortPos = new Order
            {
                Portfolio = Portfolio,
                Price = Security.ShrinkPrice(Security.BestAsk.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Sell,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(shortPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() =&amp;gt; shortPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(shortPos);
            pos = 1;
            posPrice = Security.BestAsk.Price;
        }

        private void OnNewOrderTrades(IEnumerable&amp;lt;MyTrade&amp;gt; trades)
        {
            // для каждой сделки добавляем для защитную пару стратегии
            var protectiveStrategies = trades.Select(t =&amp;gt;
            {
                // выставляет тейк-профит в 100 пунктов
                var takeProfit = new TakeProfitStrategy(t, 100);

                // выставляет стоп-лосс в 50 пунктов
                var stopLoss = new StopLossStrategy(t, 50);

                return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
            });

            ChildStrategies.AddRange(protectiveStrategies);
        }
    }
}&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/16873/</id>
    <title type="text"> Цитата: _marketDepth.TotalBidsVolume.ToString() - такая строчка у меня вывела все что нужно. В данн...</title>
    <published>2012-03-01T12:31:28Z</published>
    <updated>2012-03-01T12:31:28Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</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;&lt;br /&gt;Цитата:&lt;br /&gt;_marketDepth.TotalBidsVolume.ToString() - такая строчка у меня вывела все что нужно.&lt;br /&gt;В данном случае MarketDepth это что, объект или класс?&lt;br /&gt;&lt;br /&gt;class у меня&lt;br /&gt;&lt;br /&gt;Собственно мне кажется, что стакан у меня вовсе не создан.. Я не знаю, как мне его создать, а точнее исторически вытащить, в примере он не используется вовсе &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&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/16871/</id>
    <title type="text">&amp;quot;если нельзя убирать портфолио, то как сделать то?&amp;quot; Вопрос - что сделать? С Portfolio я разобрался, ...</title>
    <published>2012-03-01T11:46:43Z</published>
    <updated>2012-03-01T11:46:43Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.com/users/6032/</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;&amp;quot;если нельзя убирать портфолио, то как сделать то?&amp;quot;&lt;br /&gt;Вопрос - что сделать?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;С Portfolio я разобрался, ошибка была в том, что писал с маленькой буквы [blush] &lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;_marketDepth.TotalBidsVolume.ToString() - такая строчка у меня вывела все что нужно.&lt;br /&gt;В данном случае MarketDepth это что, объект или класс?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;class у меня&lt;br /&gt;&lt;br /&gt;Собственно мне кажется, что стакан у меня вовсе не создан.. Я не знаю, как мне его создать, а точнее исторически вытащить, в примере он не используется вовсе [confused] &lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;&amp;quot;&amp;quot;Замени использование числа 50 на переменную.&amp;quot; это ньюансы, с ними проблем нету вроде как&amp;quot;&lt;br /&gt;Потом это приведит к трудноуловимым ошибкам, т.к. если в 3 местах нужно использовать одно число, к примеру 140, а потом приходиться менять его на 120 ,в одном месте можно забыть поменять и пол дня искать ошибку.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;А за совет отдельное спасибо, я знал конечно, но пока я просто пытаюсь разобраться [smile] </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16869/</id>
    <title type="text">&amp;quot;если нельзя убирать портфолио, то как сделать то?&amp;quot; Вопрос - что сделать? _marketDepth.TotalBidsVolu...</title>
    <published>2012-03-01T10:32:55Z</published>
    <updated>2012-03-01T10:32:55Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&amp;quot;если нельзя убирать портфолио, то как сделать то?&amp;quot;&lt;br /&gt;Вопрос - что сделать?&lt;br /&gt;&lt;br /&gt;_marketDepth.TotalBidsVolume.ToString() - такая строчка у меня вывела все что нужно.&lt;br /&gt;В данном случае MarketDepth это что, объект или класс?&lt;br /&gt;&lt;br /&gt;&amp;quot;&amp;quot;Замени использование числа 50 на переменную.&amp;quot; это ньюансы, с ними проблем нету вроде как&amp;quot;&lt;br /&gt;Потом это приведит к трудноуловимым ошибкам, т.к. если в 3 местах нужно использовать одно число, к примеру 140, а потом приходиться менять его на 120 ,в одном месте можно забыть поменять и пол дня искать ошибку.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16856/</id>
    <title type="text">2) б) Нет, нельзя убирать строку &amp;quot;Portfolio = portfolio,&amp;quot; у заявки. 2) а) сделай так - MarketDepth.T...</title>
    <published>2012-02-29T20:23:42Z</published>
    <updated>2012-02-29T20:23:42Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.com/users/6032/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;vader &lt;a href="https://stocksharp.com/posts/m/16839/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;2) б) Нет, нельзя убирать строку &amp;quot;Portfolio = portfolio,&amp;quot; у заявки.&lt;br /&gt;2) а) сделай так - MarketDepth.TotalBidsVolume. Это же свойсто класса.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;я просто решил закомментить Interval = TimeSpan.FromSeconds(1), &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Зачем?&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;if ((Security.BestBid.Price - posPrice &amp;gt;= 50 &amp;amp;&amp;amp; pos == 0) || (posPrice - Security.BestAsk.Price &amp;gt;= 50 &amp;amp;&amp;amp; pos == 1)) // если цена ушла от заявки на 50 и более пунктов то закрываем ее&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Замени использование числа 50 на переменную.&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;

/* получаем статус заявки */                int stateOrderClose = (int)orderClose.State;                /*                 * 0 - Не отправлена в торговую систему.                 * 1 - Заявка принята биржей и активна.                 * 2 - Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы).                  * 3 - Заявка не принята торговой системой.                */                 if (stateOrderClose == 1)                {                    Trader.CancelOrder(orderClose);                }                if (stateOrderClose == 2)                {                    i = 0;                }
&lt;/pre&gt;
&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;
if(_order.State == OrderStates.Done)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;если нельзя убирать портфолио, то как сделать то?&lt;br /&gt;&lt;br /&gt;MarketDepth.TotalBidsVolume так таже самая ошибка..&lt;br /&gt;&lt;br /&gt;зачем? я ведь не генерирую стаканы, а это как я понял интервал обновления (волотильность) инструмента.. не совсем понятно&lt;br /&gt;&lt;br /&gt;&amp;quot;Замени использование числа 50 на переменную.&amp;quot; это ньюансы, с ними проблем нету вроде как</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16839/</id>
    <title type="text">2) б) Нет, нельзя убирать строку &amp;quot;Portfolio = portfolio,&amp;quot; у заявки. 2) а) сделай так - MarketDepth.T...</title>
    <published>2012-02-29T13:09:06Z</published>
    <updated>2012-02-29T13:34:04Z</updated>
    <author>
      <name>vader</name>
      <uri>https://stocksharp.com/users/28223/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">2) б) Нет, нельзя убирать строку &amp;quot;Portfolio = portfolio,&amp;quot; у заявки.&lt;br /&gt;2) а) сделай так - MarketDepth.TotalBidsVolume. Это же свойсто класса.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;я просто решил закомментить Interval = TimeSpan.FromSeconds(1), &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Зачем?&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;if ((Security.BestBid.Price - posPrice &amp;gt;= 50 &amp;amp;&amp;amp; pos == 0) || (posPrice - Security.BestAsk.Price &amp;gt;= 50 &amp;amp;&amp;amp; pos == 1)) // если цена ушла от заявки на 50 и более пунктов то закрываем ее&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Замени использование числа 50 на переменную.&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;

/* получаем статус заявки */                int stateOrderClose = (int)orderClose.State;                /*                 * 0 - Не отправлена в торговую систему.                 * 1 - Заявка принята биржей и активна.                 * 2 - Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы).                  * 3 - Заявка не принята торговой системой.                */                 if (stateOrderClose == 1)                {                    Trader.CancelOrder(orderClose);                }                if (stateOrderClose == 2)                {                    i = 0;                }
&lt;/pre&gt;
&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;
if(_order.State == OrderStates.Done)&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/16828/</id>
    <title type="text">Собственно есть две просьбы: 1) подскажите пожалуйста, как стакан то добавить (возможно я сделал все...</title>
    <published>2012-02-29T06:51:44Z</published>
    <updated>2012-02-29T06:51:44Z</updated>
    <author>
      <name>tmt</name>
      <uri>https://stocksharp.com/users/6032/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Собственно есть две просьбы:&lt;br /&gt;1) подскажите пожалуйста, как стакан то добавить (возможно я сделал все верно, но я не уверен, тк впервые это делаю)&lt;br /&gt;в документации рассмотрен пример с генерацией стакана с интервалом в 1 сек или 1 милисек.&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;
_trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security)
{
    // стакан для инструмента в истории обновляется раз в секунду
    Interval = TimeSpan.FromSeconds(1)
};&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;я просто решил закомментить Interval = TimeSpan.FromSeconds(1), возможно не так сделал&lt;br /&gt;&lt;br /&gt;2) Как потом вызвать этот стакан в стратегии, в преведущем моем топике &amp;quot;takeprofit &amp;amp;&amp;amp; stoploss&amp;quot; возможно кто-то помнит, сделано совсем не грамотно! и теперь думаю пришло время разобраться с этим.. Вот собственно весь код стратегии))&lt;br /&gt;&lt;br /&gt; а)общий объем покупки пытался получить вот так MarketDepth.TotalBidsVolume(Security), вот так MarketDepth.TotalBidsVolume.Security , но увы ничего не вышло. Пишет &amp;quot;Невызываемый член &amp;quot;StockSharp.BusinessEntities.MarketDepth.TotalBidsVolume&amp;quot; не может использоваться как метод.&amp;quot; в чем ошибка?&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;
_strategy = new NewStrategy()
			{
				Volume = 1,
				Portfolio = portfolio,
				Security = security,
				Trader = _trader
			};&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;те при создании заявки я могу просто убрать &amp;quot;Portfolio = portfolio,&amp;quot; ?&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 longPos = new Order
            {
                Portfolio = portfolio,
                Price = Security.ShrinkPrice(Security.BestBid.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Buy,
            };&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&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;
    public class NewStrategy : Strategy
    {
        int i;
        protected override void OnStarting()
        {
            this
                .When(Security.MarketDepthChanged())
                .Do(str);

            base.OnStarting();
        }

        public void str()
        {

            var totb = MarketDepth.TotalBidsVolume(Security);// общий объем покупки
            var tota = _depth.TotalAsksVolume;// общий объем продажи

            if (_position.CurrentValue != 0) // если позиция не равна 0, то будем считать, что заявок у нас нету
            {
                i = 0;
            }

            if (i == 1) // если заявка есть, то...
            {
                if ((Security.BestBid.Price - posPrice &amp;gt;= 50 &amp;amp;&amp;amp; pos == 0) || (posPrice - Security.BestAsk.Price &amp;gt;= 50 &amp;amp;&amp;amp; pos == 1)) // если цена ушла от заявки на 50 и более пунктов то закрываем ее
                {
                    var orderClose = Trader.Orders.First(o =&amp;gt; o.Id == posId);

                    /* получаем статус заявки */
                    int stateOrderClose = (int)orderClose.State;
                    /*
                     * 0 - Не отправлена в торговую систему.
                     * 1 - Заявка принята биржей и активна.
                     * 2 - Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы). 
                     * 3 - Заявка не принята торговой системой.
                    */

                    if (stateOrderClose == 1)
                    {
                        Trader.CancelOrder(orderClose);
                    }
                    if (stateOrderClose == 2)
                    {
                        i = 0;
                    }
                }
            }

            if (_position.CurrentValue == 0 &amp;amp;&amp;amp; i == 0)
            {
                if (totb &amp;gt; tota) // если общий объем покупок больше продаж, то продаем
                {
                    i = 1;
                    shortPos();
                }
                else
                {
                    i = 1;
                    longPos();
                }
            }
        }

        public void longPos()
        {
            // создаем заявку для открытия длинной позиции
            var longPos = new Order
            {
                Portfolio = portfolio,
                Price = Security.ShrinkPrice(Security.BestBid.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Buy,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(longPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() =&amp;gt; longPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(longPos);
            pos = 0;
            posPrice = Security.BestBid.Price;
        }

        public void shortPos()
        {
            // создаем заявку для открытия длинной позиции
            var shortPos = new Order
            {
                Portfolio = portfolio,
                Price = Security.ShrinkPrice(Security.BestAsk.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Sell,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(shortPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() =&amp;gt; shortPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(shortPos);
            pos = 1;
            posPrice = Security.BestAsk.Price;
        }

        private void OnNewOrderTrades(IEnumerable&amp;lt;MyTrade&amp;gt; trades)
        {
            // для каждой сделки добавляем для защитную пару стратегии
            var protectiveStrategies = trades.Select(t =&amp;gt;
            {
                // выставляет тейк-профит в 100 пунктов
                var takeProfit = new TakeProfitStrategy(t, 100);

                // выставляет стоп-лосс в 50 пунктов
                var stopLoss = new StopLossStrategy(t, 50);

                return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
            });

            ChildStrategies.AddRange(protectiveStrategies);
        }
    }&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>
</feed>