некорректная работа под Windows 8
Atom Ответить
15.11.2013


Всем привет!

Продолжая осваивать 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 Ответов
< 1 2 
Rebelion

Фотография
Курсы
Дата: 25.11.2013
Ответить


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 25.11.2013
Ответить


Rebelion Перейти

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


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

Rebelion

Фотография
Курсы
Дата: 25.11.2013
Ответить


Михаил Сухов Перейти
Rebelion Перейти

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


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 25.11.2013
Ответить


Rebelion Перейти

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


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

Rebelion

Фотография
Курсы
Дата: 25.11.2013
Ответить


Михаил Сухов Перейти
Rebelion Перейти

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


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 26.11.2013
Ответить


Rebelion Перейти
Михаил Сухов Перейти
Rebelion Перейти

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


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


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


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

Rebelion

Фотография
Курсы
Дата: 26.11.2013
Ответить


Михаил Сухов Перейти
Rebelion Перейти
Михаил Сухов Перейти
Rebelion Перейти

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


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


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


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 26.11.2013
Ответить


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

Rebelion

Фотография
Курсы
Дата: 27.11.2013
Ответить


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


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 27.11.2013
Ответить


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


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

Rebelion

Фотография
Курсы
Дата: 27.11.2013
Ответить


Михаил Сухов Перейти
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

Фотография
Автор статей Программист Трейдер
Дата: 28.11.2013
Ответить


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

Rebelion

Фотография
Курсы
Дата: 28.11.2013
Ответить


Михаил Сухов Перейти
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);
,

но эффекта не было.
Спасибо:
< 1 2 

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy