← Назад

некорректная работа под Windows 8

Всем привет!

Продолжая осваивать S#, столкнулся со следующей проблемой:

Скачал последний S#.API 4.2, Quik 6.8.4.14 Запускаю пример SAMPLE из сборника, входящего в S#.API.

Сначала на компе с Windows 7: подключается, экспорт, инструменты, стакан. все ок. Потом на компе с Windows 8: подключается, экспорт, инструменты, а стакан открывается пустым...

Как вывести наполненный стакан?

P.S. Делал свою программу выводил на форму BestAsk и BestBid через:

            _trader.NewSecurities += securities => this.GuiAsync(() =>
            {
                Securitites.ItemsSource = _trader.Securities;
                securities.ForEach(s =>
                {
                    _trader.RegisterSecurity(s);
                    _trader.RegisterMarketDepth(s);
                });
            });
            _trader.MarketDepthsChanged += depths => this.GuiAsync(() =>
            {
                depths.ForEach(d =>
                {
                    bask = string.Format("{0}", d.Security.BestAsk.Price);
                    bbid = string.Format("{0}", d.Security.BestBid.Price);                                      
                    L_Bid.Content = bbid;
                    L_Ask.Content = bask;
                });
            });

В Win7 все ок! А в Win8 ругается, что стакан RIZ3 уже открыт, надо закрыть или открыть и настроить согласно документации.

В чем дело?

Спасибо.

Комментарии (38)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Rebelion
Rebelion

С правами админа не пробовал запускать?

molasar
molasar Автор

Rebelion: С правами админа не пробовал запускать?

запуск Quik и Sample с правами админа не помогает... стакан пустой...

Уважаемые разработчики прошу вас обратить внимание на мою проблему!

esper
esper

Покажите скриншот квика с открытым стаканом для этого инструмента.

molasar
molasar Автор

esper: Покажите скриншот квика с открытым стаканом для этого инструмента.

прилагаю...

molasar
molasar Автор

esper: Покажите скриншот квика с открытым стаканом для этого инструмента.

прилагаю...

Mikhail Sukhov
Mikhail Sukhov

У кого нить есть 8-ка проверить аналогичность поведения?

esper
esper

molasar: прилагаю... Не вижу самого стакана в квике.

molasar
molasar Автор

esper:

molasar: прилагаю... Не вижу самого стакана в квике. вот скрин со стаканом квика...

esper
esper

molasar: А в Win8 ругается, что стакан RIZ3 уже открыт, надо закрыть или открыть и настроить согласно документации. Значит правильно ругается. Экспорт стакана.

molasar
molasar Автор

esper:

molasar: А в Win8 ругается, что стакан RIZ3 уже открыт, надо закрыть или открыть и настроить согласно документации. Значит правильно ругается. Экспорт стакана.

не понятен ответ. почему пример Sample в win8 ошибок не выдает, но стакан пустой?

esper
esper

molasar: не понятен ответ. почему пример Sample в win8 ошибок не выдает, но стакан пустой?

Из документации:

Заголовок окна должен содержать через @ код и класс инструмента, по которому в QuikTrader будет происходить сопоставление объекта Security и стакана. Например, для Лукойла заголовок будет LKOH@QJSIM на демо счете, и LKOH@EQBR на реальном. Для инструментов РТС класс инструмента будет равен FORTS. Стакан для июньского фьючерса на индекс РТС, к примеру, будет иметь заголовок RIM1@FORTS.

У вас стакан называется "RIZ3 [FORTS...", поэтому при открытии и выдается ошибка:

molasar: А в Win8 ругается, что стакан RIZ3 уже открыт, надо закрыть или открыть и настроить согласно документации.

Rebelion
Rebelion

Кажись, проблема с Фортсом и 4.2.1 - не дружат они. Попробуйте, например, по Лукойлу то же сделать.

Rebelion
Rebelion

Ok, хорошо, тогда вопрос - как настроить стакан по RIZ3? Почему при использовании RegisterMarketDepth в 4.1.19.1 стакан нормально подвязывался и не требовалось доп.настроек, а в 4.2.1 уже ничего не работает и требуется какая-то ручная донастройка стакана по заголовку? Кстати, менял оный - результата всё равно ноль.

esper
esper

Rebelion: Ok, хорошо, тогда вопрос - как настроить стакан по RIZ3? Почему при использовании RegisterMarketDepth в 4.1.19.1 стакан нормально подвязывался и не требовалось доп.настроек, а в 4.2.1 уже ничего не работает и требуется какая-то ручная донастройка стакана по заголовку? Кстати, менял оный - результата всё равно ноль.

Доп. настройка не требуется, но если в квике был открыт стакан, то его надо закрывать вручную. У меня на win7 и win2008 server никаких проблем нет. У вас win8 и воспроизводится эта проблема? Если в квике закрыть стакан и потом запустить робота?

Rebelion
Rebelion

Да, проблема воспроизводится. Причём, только с RIZ3 (для проверки брал Лукойл - там всё нормально отрисовалось). Закрытие, открытие стакана - никаких изменений. RegisterMarketDepth в упор не видит стакан по RIZ3, а точнее ругается, что неверно задан заголовок у окна. Ну, и на другие тож ругается, хотя, конечно, неявно. По Луку всё тип-топ. В версии 4.1.19.1 всё работает стабильно под Win8.

molasar
molasar Автор

Rebelion: Да, проблема воспроизводится. Причём, только с RIZ3 (для проверки брал Лукойл - там всё нормально отрисовалось). Закрытие, открытие стакана - никаких изменений. RegisterMarketDepth в упор не видит стакан по RIZ3, а точнее ругается, что неверно задан заголовок у окна. Ну, и на другие тож ругается, хотя, конечно, неявно. По Луку всё тип-топ. В версии 4.1.19.1 всё работает стабильно под Win8.

т.е. для торговли фРТС нужно откатиться на 4,1,19,1? других проблем с Sample под старой версией у вас не было??

Mikhail Sukhov
Mikhail Sukhov

molasar: т.е. для торговли фРТС нужно откатиться на 4,1,19,1? других проблем с Sample под старой версией у вас не было??

Вы лучше совет Эспера проверьте. По-моему вы тут друг друга запутали. У одного одна проблема. У другого другая. В итоге вы своими советами друг другу только еще хуже делаете.

molasar
molasar Автор

Михаил Сухов:

molasar: т.е. для торговли фРТС нужно откатиться на 4,1,19,1? других проблем с Sample под старой версией у вас не было??

Вы лучше совет Эспера проверьте. По-моему вы тут друг друга запутали. У одного одна проблема. У другого другая. В итоге вы своими советами друг другу только еще хуже делаете.

обозвал квик стакан RIZ@FORTS и Sample стакан наполнился)Спасибо.

Попутно есть такой вопрос. При резком увеличении количества сделок, например, утренний гэп, какой способ лучше выбрать для излечения текущей цены:

  1. Стакан с BestAsk и BestBid
  2. Последняя сделка, пусть даже 10-20 пунктов разница.

Мне кажется, что стакан все таки будет сильнее тормозить.

Rebelion
Rebelion

Собственно, да. Фортс нормально работает с версией 4.1.19.1 под Windows 8. Но есть ньюанс, как говорится - порой складывается ощущение, что винда не пускает данные с DDE в бота. Пиндусы достали своей секьюрностью а-ля ЫбlOS. Если есть твики, с помощью которых можно снести всю защиту в 8-ке - делитесь (но эт так, оффтоп). Насчёт других проблем - вопрос с RenkoCandle. Пока ещё ковыряюсь с фабрикой (за неимением достаточного кол-ва опыта и времени процесс этот медленный). Так вот, складывается ощущение, что по Renko за раз он несколько свечек формирует - так сказать, некоторые формируются "отложенным" способом. Цена уже фиг знает где, ушла выше, а он только вниз свечку отрисовал. Гонево какое-то, в общем. Возможно, это тоже связано с проблемами с DDE в Win8 - на 7-ке буду сегодня проверять ночкой, думаю.

Rebelion
Rebelion

molasar, а какие поля в таблице "инструменты" по 4.2.1 используете? Просто у меня на стандартных настройках, что из wnd файла версии 4.2.1, экспорт таблицы "инструменты" по DDE ругается - пишет, мол, не удалось установить соединение. Либо не запущен "инструменты", либо в него не загружен лист. При этом Verifier никаких ошибок не выдаёт. Поля таблицы "инструменты": бумага, код бумаги, код класса, статус, лот, ша цены, цена последней сделки.

P.S. ни одна таблица не экспортируется. Видимо, проблема либо в "stocksharp", либо в указании какого-либо листа в настройках вывода по DDE.

molasar
molasar Автор

Rebelion: molasar, а какие поля в таблице "инструменты" по 4.2.1 используете? Просто у меня на стандартных настройках, что из wnd файла версии 4.2.1, экспорт таблицы "инструменты" по DDE ругается - пишет, мол, не удалось установить соединение. Либо не запущен "инструменты", либо в него не загружен лист. При этом Verifier никаких ошибок не выдаёт. Поля таблицы "инструменты": бумага, код бумаги, код класса, статус, лот, ша цены, цена последней сделки.

P.S. ни одна таблица не экспортируется. Видимо, проблема либо в "stocksharp", либо в указании какого-либо листа в настройках вывода по DDE.

я загружаю файл настроек info_extended.wnd из папки stocksharp/samples/quik. и ничего не меняю, только название стакана в случае с RIZ3.

Mikhail Sukhov
Mikhail Sukhov

Rebelion: экспорт таблицы "инструменты" по DDE ругается - пишет, мол, не удалось установить соединение. Либо не запущен "инструменты", либо в него не загружен лист.

Известная проблема. Квик и робот запущены из под разных привилегий. Или отключайте UAC, или давайте программам одинаковые привилегии.

Rebelion
Rebelion

Я беру обычный info.wnd. Попытался запустить SampleSMA пример - исторические данные отобразились, текущие свечки - нет. В общем, всё как-то странно. Я уже 8-ку снёс и поставил 7-ку - ноль резалтов.

Сейчас повесил эвент на CandleManager.Processing - не вызывается в принципе. Теряюсь в догадках.

molasar
molasar Автор

Rebelion: Я беру обычный info.wnd. Попытался запустить SampleSMA пример - исторические данные отобразились, текущие свечки - нет. В общем, всё как-то странно. Я уже 8-ку снёс и поставил 7-ку - ноль резалтов.

Сейчас повесил эвент на CandleManager.Processing - не вызывается в принципе. Теряюсь в догадках.

когда я загружаю обычный info.wnd, то у меня почему то не отражаются таблицы, рабочее поле остается пустым... поэтому я загружаю info_extended.wnd.

попробуйте info_extended.wnd и пример Sample.

Какая у вас версия Quik? У меня 6.8.4.14.

Rebelion
Rebelion

molasar:

Rebelion: Я беру обычный info.wnd. Попытался запустить SampleSMA пример - исторические данные отобразились, текущие свечки - нет. В общем, всё как-то странно. Я уже 8-ку снёс и поставил 7-ку - ноль резалтов.

Сейчас повесил эвент на CandleManager.Processing - не вызывается в принципе. Теряюсь в догадках.

когда я загружаю обычный info.wnd, то у меня почему то не отражаются таблицы, рабочее поле остается пустым... поэтому я загружаю info_extended.wnd.

попробуйте info_extended.wnd и пример Sample.

Какая у вас версия Quik? У меня 6.8.4.14.

Самая последняя - 6.9.3. На info_extended.wnd вообще ругается даже Verifier. Чисто Sample пашет, но мну нужно свечки формировать.

Rebelion
Rebelion

Всё, буду писать только тут. Работаю из-под суперадмина, UAC и прочая в 7-ке отключены и оттвиканы.

А проблема вот какого рода: tсли использовать RealTimeEmulationTrader, то ничего не отрисовывается. Меняем на QuikTrader - всё чудесненько работает. Был ли изменён как-то RealTimeEmulationTrader?

Mikhail Sukhov
Mikhail Sukhov

Rebelion: А проблема вот какого рода: tсли использовать RealTimeEmulationTrader, то ничего не отрисовывается. Меняем на QuikTrader - всё чудесненько работает. Был ли изменён как-то RealTimeEmulationTrader?

Да, теперь он не запускает сам экспорт данных у внуртеннего шлюза, если он его сам не создал.

Rebelion
Rebelion

Михаил Сухов:

Rebelion: А проблема вот какого рода: tсли использовать RealTimeEmulationTrader, то ничего не отрисовывается. Меняем на QuikTrader - всё чудесненько работает. Был ли изменён как-то RealTimeEmulationTrader?

Да, теперь он не запускает сам экспорт данных у внуртеннего шлюза, если он его сам не создал.

Михаил, а можно как-либо разжиться примером обновлённого варианта работы с эмуляшкой? Денег просто жалко на тестировании на реальных счетах. :-(

Mikhail Sukhov
Mikhail Sukhov

Rebelion: Михаил, а можно как-либо разжиться примером обновлённого варианта работы с эмуляшкой? Денег просто жалко на тестировании на реальных счетах. :-(

А ничего не изменилось в плане примеров.

Rebelion
Rebelion

Михаил Сухов:

Rebelion: А проблема вот какого рода: tсли использовать RealTimeEmulationTrader, то ничего не отрисовывается. Меняем на QuikTrader - всё чудесненько работает. Был ли изменён как-то RealTimeEmulationTrader?

Да, теперь он не запускает сам экспорт данных у внуртеннего шлюза, если он его сам не создал.

Ну, в 4.1.19.1 этого не требовалось. Сорри за нубство. Просто я не понимаю, как теперь сделать, ну хоть убей...

Mikhail Sukhov
Mikhail Sukhov

Rebelion:

Михаил Сухов:

Rebelion: А проблема вот какого рода: tсли использовать RealTimeEmulationTrader, то ничего не отрисовывается. Меняем на QuikTrader - всё чудесненько работает. Был ли изменён как-то RealTimeEmulationTrader?

Да, теперь он не запускает сам экспорт данных у внуртеннего шлюза, если он его сам не создал.

Ну, в 4.1.19.1 этого не требовалось. Сорри за нубство. Просто я не понимаю, как теперь сделать, ну хоть убей...

А что вы хотите сделать? Экспорт запускается как и раньше. Я писал что у вас ошибке привелегий.

Rebelion
Rebelion

Михаил Сухов:

Rebelion:

Михаил Сухов:

Rebelion: А проблема вот какого рода: tсли использовать RealTimeEmulationTrader, то ничего не отрисовывается. Меняем на QuikTrader - всё чудесненько работает. Был ли изменён как-то RealTimeEmulationTrader?

Да, теперь он не запускает сам экспорт данных у внуртеннего шлюза, если он его сам не создал.

Ну, в 4.1.19.1 этого не требовалось. Сорри за нубство. Просто я не понимаю, как теперь сделать, ну хоть убей...

А что вы хотите сделать? Экспорт запускается как и раньше. Я писал что у вас ошибке привелегий.

Я уже снёс 8-ку и поставил 7-ку, перенастроил все права, поставил всюду запуск из-под администратора, оттвикал всё через групповые политики на права рута и т.п. Ваши же слова были "Да, теперь он не запускает сам экспорт данных у внуртеннего шлюза, если он его сам не создал". Это что теперь значит? Запускаю сборку под 4.1.19.1 - всё пашет. С теми же правами запускаю сборку того же кода под 4.2.1 - не пашет. Перезагрузки, запуски всего и вся из-под суперадмина - не помогает... :-(

Mikhail Sukhov
Mikhail Sukhov

Давайте по порядку. У вас проблема как у автора топика? Его решение не помогло вашей проблеме? Что именно у вас за проблема?

Rebelion
Rebelion

Михаил Сухов: Давайте по порядку. У вас проблема как у автора топика? Его решение не помогло вашей проблеме? Что именно у вас за проблема?

Михаил, приветствую!

Да, изначально проблема была схожей - у меня стояла 8-ка, всё работало под 4.1.19.1, под 4.2.1 эмулятор на реальных данных работать отказывался (RealTimeEmulationTrader). При этом замена в коде RealTimeEmulationTrader на QuikTrader давала эффект - графики отображались, стратегии работали. Я изначально грешил на 8-ку и её долбанную оверсекьюрность. Снёс 8-ку, поставил 7-ку, оттвикал по правам админа и т.п. Но для RealTimeEmulationTrader ничего не изменилось. Вы сказали, что теперь он как-то иначе запускает экспорт данных. Вот, хотелось бы понять, как именно, т.е. что нужно прописать в коде, чтобы RealTimeEmulationTrader работал как в 4.1.19.1...

Mikhail Sukhov
Mikhail Sukhov

Rebelion: Вот, хотелось бы понять, как именно, т.е. что нужно прописать в коде, чтобы RealTimeEmulationTrader работал как в 4.1.19.1...

Давайте еще раз определимся с вашей проблемой. Вы в своем роботе запускаете экпорт? Потому как если вы этого не делаете, то работать, конечно же, ничего не будет.

Rebelion
Rebelion

Михаил Сухов:

Rebelion: Вот, хотелось бы понять, как именно, т.е. что нужно прописать в коде, чтобы RealTimeEmulationTrader работал как в 4.1.19.1...

Давайте еще раз определимся с вашей проблемой. Вы в своем роботе запускаете экпорт? Потому как если вы этого не делаете, то работать, конечно же, ничего не будет.

Михаил, сделаем проще. Вот мой нубокод, полученный катом SampleSMA кода. Скоро перепишу нормально, по-папски. :-)

namespace HFTBot
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ComponentModel;
    using System.IO;
    using System.Windows;
    using System.Windows.Forms;
    using System.Windows.Controls;
    using System.Windows.Media;
    using MessageBox = System.Windows.MessageBox;

    using Ecng.Collections;
    using Ecng.Common;
    using Ecng.Xaml;

    using StockSharp.Algo.Candles;
    using StockSharp.BusinessEntities;
    using StockSharp.Logging;
    using StockSharp.Quik;
    using StockSharp.Xaml.Charting;
    using StockSharp.Algo.Testing;


    using System.Xml;


    public class StrategyParameters : ICloneable
    {
        public double candleSize;
        public double epsEntryBounds;
        public double epsEntryMA;
        public double epsStopLoss;
        public int period;
        public double stdevCount;
        public string name;
        public string exchange;

        public StrategyParameters()
        {
            candleSize = 1.0;
            epsEntryBounds = 100.0;
            epsEntryMA = 100.0;
            epsStopLoss = 100.0;
            period = 10;
            stdevCount = 2.65;
            name = "noname";
            exchange = "Forts";
        }

        public object Clone()
        {
            StrategyParameters result = new StrategyParameters();
            result.candleSize = candleSize;
            result.epsEntryBounds = epsEntryBounds;
            result.epsEntryMA = epsEntryMA;
            result.epsStopLoss = epsStopLoss;
            result.period = period;
            result.stdevCount = stdevCount;
            result.name = name;
            result.exchange = exchange;

            return result;
        }
    }

    public class InstrumentDescription
    {
        public StockBotStrategy strategy;
        public Portfolio portfolio;
        public Security security;
        public StrategyParameters strategyParams;
        public Chart chart;
        public ChartArea area;
        public ChartCandleElement candleElem;

        public ChartTradeElement tradesIndicator;
        public CandleSeries series;
        public bool isFormed = false;
    }

    public partial class MainWindow
    {
        private List<InstrumentDescription> instruments = new List<InstrumentDescription>();

        private RealTimeEmulationTrader realTimeTradeEmulation;
        private CandleManager realtimeCandleManager;

        private DateTime stockBotTimeStarting;

        private List<string> mails = new List<string>();
        //private System.Threading.Timer refresherTimer = new System.Threading.Timer(() => {}
        private void OnLog(LogMessage message)
        {
            if (message.Level != LogLevels.Info && message.Level != LogLevels.Debug)
                this.GuiAsync(() => MessageBox.Show(this, message.Message));
        }

        private void CreateStrategyFromInstrument(Security currentSecurity, StrategyParameters currentParams, InstrumentDescription instrument)
        {            
            instrument.portfolio = new Portfolio()
            {
                Name = "TEST  " + instrument.strategyParams.name,
                BeginValue = 500000m,
                CurrentValue = 500000m,
                //ExchangeBoard = ExchangeBoard.GetBoard(instrument.strategyParams.exchange),
            };

            instrument.series = new CandleSeries(typeof(RangeCandle), currentSecurity, new Unit((decimal)instrument.strategyParams.candleSize));
            instrument.strategy = new StockBotStrategy(instrument.series, currentParams)
            {
                Volume = 1,
                Security = currentSecurity,
                Portfolio = instrument.portfolio,
                Trader = realTimeTradeEmulation,
            };

            instrument.strategy.Log += OnLog;

            TabItem addedItem;
            stockCharts.Items.Add(addedItem = new TabItem() { Header = currentParams.name, Content = new Chart() });

            instrument.chart = (Chart)addedItem.Content;

            if (((Chart)addedItem.Content).Areas.IsEmpty())
                ((Chart)addedItem.Content).Areas.Add(new ChartArea());

            instrument.area = ((Chart)addedItem.Content).Areas.Last();
               
            instrument.area.Elements.Add(instrument.candleElem = new ChartCandleElement());

            #region new filters

            instrument.area.Elements.Add(instrument.tradesIndicator = new ChartTradeElement()
                                        {
                                            BuyColor = Colors.Green,
                                            SellColor = Colors.Red,
                                            IsLegend = true,
                                        });

            #endregion

            ((TabItem)(stockCharts.Items.GetItemAt(0))).Focus();

            instrument.strategy.strategyTimeStarting = stockBotTimeStarting;
            instrument.isFormed = true;
        }

        private void GetStrategyParameters()
        {
            XmlDocument config = new XmlDocument();
            config.Load(XmlReader.Create(new FileStream(@"c:\hftConfig.xml", FileMode.Open, FileAccess.Read)));

            XmlNodeList dataNodes = config.GetElementsByTagName("Root").Item(0).ChildNodes;

            foreach (XmlNode elem in dataNodes)
            {
                instruments.Add(new InstrumentDescription()
                {
                    strategyParams = new StrategyParameters()
                    {
                        name = elem.Attributes["Name"].Value,
                        candleSize = double.Parse(elem.Attributes["Price"].Value),
                        epsEntryBounds = double.Parse(elem.Attributes["epsEntryBounds"].Value),
                        epsEntryMA = double.Parse(elem.Attributes["epsEntryMA"].Value),
                        epsStopLoss = double.Parse(elem.Attributes["epsStopLoss"].Value),
                        period = int.Parse(elem.Attributes["period"].Value),
                        stdevCount = double.Parse(elem.Attributes["stdevCount"].Value),
                        //exchange = elem.Attributes["Exchange"].Value,
                    },
                });
            }
        }

        private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            
            instruments.ForEach((elem) => this.GuiAsync(() =>
            {
                PnL.Content = elem.strategy.PnL;
                Position.Content = elem.strategy.Position;
            }));
            
        }

        public MainWindow()
        {
            InitializeComponent();

            instruments = new List<InstrumentDescription>();
            stockBotTimeStarting = DateTime.Now;

            // попробовать сразу найти месторасположение Quik по запущенному процессу
            Path.Text = QuikTerminal.GetDefaultPath();

            GetStrategyParameters();
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            if (realTimeTradeEmulation != null)
                realTimeTradeEmulation.Dispose();

            base.OnClosing(e);
        }

        private void FindPathClick(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 ConnectClick(object sender, RoutedEventArgs e)
        {
            if (Path.Text.IsEmpty())
            {
                MessageBox.Show(this, "Путь к Quik не выбран.");
                return;
            }

            realTimeTradeEmulation = new RealTimeEmulationTrader(new QuikTrader(Path.Text));
            realTimeTradeEmulation.Connected += (() => 
            { 
                realtimeCandleManager = new CandleManager(realTimeTradeEmulation);

                realTimeTradeEmulation.NewSecurities += securities => this.GuiAsync(() =>
                {
                    securities.ForEach(stock =>
                    {
                        var instrument = instruments.FirstOrDefault(x => x.strategyParams.name.CompareTo(stock.Code) == 0);

                        if (instrument != null)
                        {
                            realTimeTradeEmulation.RegisterSecurity(stock);
                            realTimeTradeEmulation.RegisterMarketDepth(stock);
                            realTimeTradeEmulation.RegisterTrades(stock);

                            CreateStrategyFromInstrument(stock, instrument.strategyParams, instrument);

                            realTimeTradeEmulation.RegisterPortfolio(instrument.portfolio);
                        }
                    });                    
                });

                realTimeTradeEmulation.NewPortfolios += myPortfolios => this.GuiAsync(() => _portfolios.Portfolios.AddRange(myPortfolios));
                realTimeTradeEmulation.NewOrders += orders => this.GuiAsync(() =>
                {
                    _orders.Orders.AddRange(orders);
                });
                
                realTimeTradeEmulation.NewMyTrades += trades => 
                {
                    instruments.ForEach(elem =>
                    {
                        if (elem.isFormed)
                        {
                            var currentElemTrades = trades.Where(t => elem.strategy.Orders.Any(o => o == t.Order));
                            this.GuiAsync(() => _trades.Trades.AddRange(currentElemTrades));

                            currentElemTrades.ForEach(strategyTrade =>
                            {
                                var tradeTime = elem.strategy.lastWorkedCandle == null ? strategyTrade.Order.Time : elem.strategy.lastWorkedCandle.OpenTime;
                                this.GuiAsync(() => elem.chart.ProcessValues(tradeTime, new Dictionary<IChartElement, object> { { elem.tradesIndicator, strategyTrade } }));
                            });
                        }
                    });
                };
                
                realtimeCandleManager.Processing += (series, candle) =>
                {
                    if (candle.State == CandleStates.Finished)
                        ProcessCandle(candle);
                };

                realTimeTradeEmulation.StartExport();

                this.GuiAsync(() => { Start.IsEnabled = true; });
            });

            realTimeTradeEmulation.Connect();
        }

        private void StartClick(object sender, RoutedEventArgs e)
        {
            instruments.ForEach(elem =>
            {
                if (elem.isFormed)
                {
                    realtimeCandleManager.Start(elem.series, DateTime.Today + new TimeSpan(10, 0, 0), DateTime.Today + new TimeSpan(23, 50, 00));
                    elem.strategy.Start();
                }
            });


            instruments.ForEach((elem) => elem.strategy.PropertyChanged += OnStrategyPropertyChanged);

            Start.Content = "Стоп";
        }

        private void ProcessCandle(Candle candle)
        {
            var currentInstrument = instruments.FirstOrDefault(elem => elem.strategyParams.name.CompareTo(candle.Security.Code) == 0);

            if (currentInstrument != null)
            {
                #region new chart painter

                this.GuiAsync(() =>
                {
                    currentInstrument.chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                    {
                        { currentInstrument.candleElem, candle },
                    });
                });

                #endregion
            }
        }
    }
}

Собственно, он не пашет - не отрисовываются свечки и т.п., хотя в 4.1.19.1 всё пахало. Что я тут делаю не так? При этом меняем эмуляшку на торговую систему QuikTrader - всё пашет, но на "живую".

Mikhail Sukhov
Mikhail Sukhov

RtEmu не является создателем шлюза для квика. Поэтому он не может самостоятельно управлять экспортом.

Rebelion
Rebelion

Михаил Сухов: RtEmu не является создателем шлюза для квика. Поэтому он не может самостоятельно управлять экспортом.

Сделал так:

realTimeTradeEmulation.UnderlyingTrader.RegisterSecurity(stock);
realTimeTradeEmulation.UnderlyingTrader.RegisterMarketDepth(stock);
realTimeTradeEmulation.UnderlyingTrader.RegisterTrades(stock);
realTimeTradeEmulation.UnderlyingTrader.RegisterPortfolio(instrument.portfolio);

Добавил

realTimeTradeEmulation.UnderlyingTrader.StartExport();
realTimeTradeEmulation.StartExport();

Стакан начал подцепляться автоматически. Но отрисовка свечек так и не идёт. Видимо, надо как-то пошаманить ещё с CandleManager. Пытался делать

realtimeCandleManager = new CandleManager(realTimeTradeEmulation.UnderlyingTrader);

вместо

realtimeCandleManager = new CandleManager(realTimeTradeEmulation);
```,

но эффекта не было.