﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">quotechangemessage. StockSharp</title>
  <id>https://stocksharp.ru/handlers/atom.ashx?category=tag&amp;id=quotechangemessage&amp;type=forum</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-02T03:07:20Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=tag&amp;id=quotechangemessage&amp;type=forum" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/topic/11993/</id>
    <title type="text">Как настроить HistoryEmulationConnector, чтобы изменить частоту появления QuoteChangeMessage сообщений (connector.NewMessage)</title>
    <published>2020-07-17T19:44:53Z</published>
    <updated>2020-07-17T20:46:36Z</updated>
    <author>
      <name>Дмитрий_</name>
      <uri>https://stocksharp.ru/users/62269/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="WhenMarketDepthChanged" />
    <category term="QuoteChangeMessage" />
    <content type="html">&lt;p&gt;Добрый день&lt;/p&gt;
&lt;p&gt;Имею исторические данные (сделки - trades.bin). Для тестирования стратегии нужен стакан, поэтому для его генерации использую connector.RegisterMarketDepth(new TrendMarketDepthGenerator(connector.GetSecurityId(security)).&lt;/p&gt;
&lt;p portfolio=""&gt;У HistoryEmulationConnector QuoteChangeMessage (так же правило this.Security.WhenMarketDepthChanged в стратегии) приходит раз минуту.
Пробовал менять:
1)
connector  = new HistoryEmulationConnector(secProvider, new[] )
,
MarketTimeChangedInterval = TimeSpan.FromSeconds(1),
}
2)
connector.RegisterMarketDepth(new TrendMarketDepthGenerator(connector.GetSecurityId(security))
Изменение стакана всё равно происходит раз в минуту.&lt;/p&gt;
&lt;p&gt;Как настроить HistoryEmulationConnector, чтобы изменить частоту появления QuoteChangeMessage сообщений (connector.NewMessage и this.Security.WhenMarketDepthChanged в стратегии) и изменять стакан с приходом сделки (GenerateDepthOnEachTrade = true)?&lt;/p&gt;
&lt;p&gt;Код создан на основе проекта SampleHistoryTesting. [url=115117]HistoryTest.zip[/url]
[spoiler]        static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.Black;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        var exchangeInfoProvider = new InMemoryExchangeInfoProvider();

        var idStr = &amp;quot;SBER@TQBR&amp;quot;;
        var id = idStr.ToSecurityId();
        var secCode = id.SecurityCode;
        var board = exchangeInfoProvider.GetOrCreateBoard(id.BoardCode);

        var security = new Security
        {
            Id = &amp;quot;SBER@TQBR&amp;quot;,
            Code = secCode,
            Board = board,
        };

        var storageRegistry = new StorageRegistry
        {
            DefaultDrive = new LocalMarketDataDrive(@&amp;quot;H:\rep\History\MarketData&amp;quot;)
        };

        var startTime = (new DateTime(2020, 2, 1)).UtcKind();
        var stopTime = (new DateTime(2020, 2, 5)).UtcKind();

        var portfolio = Portfolio.CreateSimulator();
        var secProvider = (ISecurityProvider)new CollectionSecurityProvider(new[] { security });

        var connector = new HistoryEmulationConnector(secProvider, new[] { portfolio })
        {
            EmulationAdapter =
            {
                Settings =
                {
                    MatchOnTouch = false,
                },
            },
            HistoryMessageAdapter =
            {
                StorageRegistry = storageRegistry,
                MarketTimeChangedInterval = TimeSpan.FromSeconds(1)
            },
            MarketTimeChangedInterval = TimeSpan.FromSeconds(1),
        };

        var series = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromHours(1))
        {
            BuildCandlesMode = MarketDataBuildModes.Build,
            BuildCandlesFrom2 = null,
        };

        var strategy = new SmaStrategy(series)
        {
            Volume = 1,
            Portfolio = portfolio,
            Security = security,
            Connector = connector,
            LogLevel = LogLevels.Info,
        };

        connector.HistoryMessageAdapter.StartDate = startTime;
        connector.HistoryMessageAdapter.StopDate = stopTime;

        connector.SecurityReceived += (subscr, s) =&amp;gt;
        {
            connector.SubscribeMarketDepth(security);
            connector.RegisterMarketDepth(new TrendMarketDepthGenerator(connector.GetSecurityId(security))
            {
                Interval = TimeSpan.FromSeconds(1),
                MaxAsksDepth = 10,
                MaxBidsDepth = 10,
                UseTradeVolume = true,
                MaxVolume = 1000,
                MinSpreadStepCount = 2, 
                MaxSpreadStepCount = 5, 
                MaxPriceStepCount = 3,
                GenerateDepthOnEachTrade = true
            });
            strategy.Start();
            connector.Start();
        };

        connector.NewMessage += message =&amp;gt;
        {
            if (message is QuoteChangeMessage quoteMsg)
            {
                Console.BackgroundColor = ConsoleColor.Cyan;
                Console.WriteLine(quoteMsg);
            }
        };

        connector.Connect();

        Console.ReadLine();
    }[/spoiler]
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
</feed>