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

некорректная работа под Windows 8
Atom
11/15/2013
molasar


Всем привет!

Продолжая осваивать 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 уже открыт, надо закрыть или открыть и настроить согласно документации.

В чем дело?

Спасибо.

Tags:


Thanks:


<< < 2 3 4 
Mikhail Sukhov

Avatar
Date: 11/26/2013
Reply


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

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


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


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


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

Rebelion

Avatar
Date: 11/26/2013
Reply


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

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


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


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


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


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

Mikhail Sukhov

Avatar
Date: 11/27/2013
Reply


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

Rebelion

Avatar
Date: 11/27/2013
Reply


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


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

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

Mikhail Sukhov

Avatar
Date: 11/27/2013
Reply


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


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

Rebelion

Avatar
Date: 11/28/2013
Reply


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


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


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

Code
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 - всё пашет, но на "живую".
Thanks:

Mikhail Sukhov

Avatar
Date: 11/28/2013
Reply


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

Rebelion

Avatar
Date: 11/28/2013
Reply


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


Сделал так:

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


Добавил

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


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

Code
realtimeCandleManager = new CandleManager(realTimeTradeEmulation.UnderlyingTrader);


вместо

Code
realtimeCandleManager = new CandleManager(realTimeTradeEmulation);
,

но эффекта не было.
Thanks:
<< < 2 3 4 

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy