示例#1
0
        private void DrawTestData()
        {
            //
            // prepare test data

            var asset = new Security
            {
                Id        = "RIM4@FORTS",
                PriceStep = 10,
            };

            asset.LastTrade = new Trade
            {
                Security = asset,
                Price    = 130000,
            };

            var expiryDate = new DateTime(2014, 09, 15);
            var currDate   = new DateTime(2014, 08, 15);

            var securities = new List <Security>
            {
                asset,

                CreateStrike(105000, 10, 60, OptionTypes.Call, expiryDate, asset, 100),
                CreateStrike(110000, 10, 53, OptionTypes.Call, expiryDate, asset, 343),
                CreateStrike(115000, 10, 47, OptionTypes.Call, expiryDate, asset, 3454),
                CreateStrike(120000, 78, 42, OptionTypes.Call, expiryDate, asset, null),
                CreateStrike(125000, 32, 35, OptionTypes.Call, expiryDate, asset, 100),
                CreateStrike(130000, 3245, 32, OptionTypes.Call, expiryDate, asset, 55),
                CreateStrike(135000, 3454, 37, OptionTypes.Call, expiryDate, asset, 456),
                CreateStrike(140000, 34, 45, OptionTypes.Call, expiryDate, asset, 4),
                CreateStrike(145000, 3566, 51, OptionTypes.Call, expiryDate, asset, 67),
                CreateStrike(150000, 454, 57, OptionTypes.Call, expiryDate, asset, null),
                CreateStrike(155000, 10, 59, OptionTypes.Call, expiryDate, asset, 334),

                CreateStrike(105000, 10, 50, OptionTypes.Put, expiryDate, asset, 100),
                CreateStrike(110000, 10, 47, OptionTypes.Put, expiryDate, asset, 343),
                CreateStrike(115000, 6788, 42, OptionTypes.Put, expiryDate, asset, 3454),
                CreateStrike(120000, 10, 37, OptionTypes.Put, expiryDate, asset, null),
                CreateStrike(125000, 567, 32, OptionTypes.Put, expiryDate, asset, 100),
                CreateStrike(130000, 4577, 30, OptionTypes.Put, expiryDate, asset, 55),
                CreateStrike(135000, 67835, 32, OptionTypes.Put, expiryDate, asset, 456),
                CreateStrike(140000, 13245, 35, OptionTypes.Put, expiryDate, asset, 4),
                CreateStrike(145000, 10, 37, OptionTypes.Put, expiryDate, asset, 67),
                CreateStrike(150000, 454, 39, OptionTypes.Put, expiryDate, asset, null),
                CreateStrike(155000, 10, 41, OptionTypes.Put, expiryDate, asset, 334)
            };

            var dummyProvider = new DummyProvider(securities, new[]
            {
                new Position
                {
                    Security     = asset,
                    CurrentValue = -1,
                },

                new Position
                {
                    Security     = securities.First(s => s.OptionType == OptionTypes.Call),
                    CurrentValue = 10,
                },

                new Position
                {
                    Security     = securities.First(s => s.OptionType == OptionTypes.Put),
                    CurrentValue = -3,
                }
            });

            _model.MarketDataProvider   = dummyProvider;
            _model.ExchangeInfoProvider = new InMemoryExchangeInfoProvider();
            _model.UnderlyingAsset      = asset;

            //
            // draw test data on the pos chart

            PosChart.MarketDataProvider   = dummyProvider;
            PosChart.ExchangeInfoProvider = _model.ExchangeInfoProvider;
            PosChart.SecurityProvider     = dummyProvider;
            PosChart.PositionProvider     = dummyProvider;

            PosChart.UnderlyingAsset = asset;
            PosChart.Options.Add(securities.First(s => s.OptionType == OptionTypes.Call));
            PosChart.Options.Add(securities.First(s => s.OptionType == OptionTypes.Put));

            PosChart.Refresh(null, currDate, expiryDate);

            //
            // draw test data on the desk

            foreach (var option in securities.Where(s => s.Type == SecurityTypes.Option))
            {
                _model.Add(option);
            }

            //
            // draw test data on the smile chart

            RefreshSmile(currDate);
        }
示例#2
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (Connector != null && !(Connector is FakeConnector))
            {
                return;
            }

            PosChart.Positions.Clear();
            PosChart.AssetPosition = null;
            PosChart.Refresh(1, 1, default(DateTimeOffset), default(DateTimeOffset));

            // create connection
            Connector = new QuikTrader();

            //_trader = new PlazaTrader { IsCGate = true };
            //_trader.Tables.Add(_trader.TableRegistry.Volatility);

            Portfolio.Portfolios = new PortfolioDataSource(Connector);

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            // fill underlying asset's list
            Connector.NewSecurities += securities =>
                                       _assets.AddRange(securities.Where(s => s.Type == SecurityTypes.Future));

            Connector.SecuritiesChanged += securities =>
            {
                if ((PosChart.AssetPosition != null && securities.Contains(PosChart.AssetPosition.Security)) || PosChart.Positions.Cache.Select(p => p.Security).Intersect(securities).Any())
                {
                    _isDirty = true;
                }
            };

            // subscribing on tick prices and updating asset price
            Connector.NewTrades += trades =>
            {
                var assetPos = PosChart.AssetPosition;
                if (assetPos != null && trades.Any(t => t.Security == assetPos.Security))
                {
                    _isDirty = true;
                }
            };

            Connector.NewPositions += positions => this.GuiAsync(() =>
            {
                var asset = SelectedAsset;

                if (asset == null)
                {
                    return;
                }

                var assetPos = positions.FirstOrDefault(p => p.Security == asset);
                var newPos   = positions.Where(p => p.Security.UnderlyingSecurityId == asset.Id).ToArray();

                if (assetPos == null && newPos.Length == 0)
                {
                    return;
                }

                if (assetPos != null)
                {
                    PosChart.AssetPosition = assetPos;
                }

                if (newPos.Length > 0)
                {
                    PosChart.Positions.AddRange(newPos);
                }

                RefreshChart();
            });

            Connector.PositionsChanged += positions => this.GuiAsync(() =>
            {
                if ((PosChart.AssetPosition != null && positions.Contains(PosChart.AssetPosition)) || positions.Intersect(PosChart.Positions.Cache).Any())
                {
                    RefreshChart();
                }
            });

            Connector.Connect();
        }
示例#3
0
        public MainWindow()
        {
            InitializeComponent();

            var assetsSource  = new ObservableCollectionEx <Security>();
            var optionsSource = new ObservableCollectionEx <Security>();

            Options.ItemsSource = optionsSource;
            Assets.ItemsSource  = assetsSource;

            _assets  = new ThreadSafeObservableCollection <Security>(assetsSource);
            _options = new ThreadSafeObservableCollection <Security>(optionsSource);

            var timer = new DispatcherTimer {
                Interval = TimeSpan.FromSeconds(5)
            };

            timer.Tick += (sender, args) =>
            {
                if (!_isDirty)
                {
                    return;
                }

                _isDirty = false;
                RefreshChart();
            };
            timer.Start();

            //
            // draw test data on the chart

            var asset = new Security {
                Id = "RIM4@FORTS"
            };

            Connector = new FakeConnector(new[] { asset });

            PosChart.AssetPosition = new Position
            {
                Security     = asset,
                CurrentValue = -1,
            };

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            var expDate = new DateTime(2014, 6, 14);

            PosChart.Positions.Add(new Position
            {
                Security = new Security {
                    Code = "RI C 110000", Strike = 110000, ImpliedVolatility = 45, OptionType = OptionTypes.Call, ExpiryDate = expDate, Board = ExchangeBoard.Forts, UnderlyingSecurityId = asset.Id
                },
                CurrentValue = 10,
            });
            PosChart.Positions.Add(new Position
            {
                Security = new Security {
                    Code = "RI P 95000", Strike = 95000, ImpliedVolatility = 30, OptionType = OptionTypes.Put, ExpiryDate = expDate, Board = ExchangeBoard.Forts, UnderlyingSecurityId = asset.Id
                },
                CurrentValue = -3,
            });

            PosChart.Refresh(100000, 10, new DateTime(2014, 5, 5), expDate);

            Instance = this;
        }
示例#4
0
        private void DrawTestData()
        {
            //
            // draw test data on the pos chart

            var asset = new Security
            {
                Id = "RIM4@FORTS"
            };

            var dummyProvider = new DummyProvider(new[] { asset });

            PosChart.AssetPosition = new Position
            {
                Security     = asset,
                CurrentValue = -1,
            };

            PosChart.MarketDataProvider = dummyProvider;
            PosChart.SecurityProvider   = dummyProvider;

            var expDate = new DateTime(2014, 6, 14);

            PosChart.Positions.Add(new Position
            {
                Security = new Security
                {
                    Code                 = "RI C 110000",
                    Strike               = 110000,
                    ImpliedVolatility    = 45,
                    OptionType           = OptionTypes.Call,
                    ExpiryDate           = expDate,
                    Board                = ExchangeBoard.Forts,
                    UnderlyingSecurityId = asset.Id
                },
                CurrentValue = 10,
            });
            PosChart.Positions.Add(new Position
            {
                Security = new Security
                {
                    Code                 = "RI P 95000",
                    Strike               = 95000,
                    ImpliedVolatility    = 30,
                    OptionType           = OptionTypes.Put,
                    ExpiryDate           = expDate,
                    Board                = ExchangeBoard.Forts,
                    UnderlyingSecurityId = asset.Id
                },
                CurrentValue = -3,
            });

            PosChart.Refresh(100000, 10, new DateTime(2014, 5, 5), expDate);

            //
            // draw test data on the desk

            var expiryDate = new DateTime(2014, 09, 15);

            _model.MarketDataProvider = dummyProvider;
            _model.UnderlyingAsset    = asset;

            _model.Add(CreateStrike(05000, 10, 60, OptionTypes.Call, expiryDate, asset, 100));
            _model.Add(CreateStrike(10000, 10, 53, OptionTypes.Call, expiryDate, asset, 343));
            _model.Add(CreateStrike(15000, 10, 47, OptionTypes.Call, expiryDate, asset, 3454));
            _model.Add(CreateStrike(20000, 78, 42, OptionTypes.Call, expiryDate, asset, null));
            _model.Add(CreateStrike(25000, 32, 35, OptionTypes.Call, expiryDate, asset, 100));
            _model.Add(CreateStrike(30000, 3245, 32, OptionTypes.Call, expiryDate, asset, 55));
            _model.Add(CreateStrike(35000, 3454, 37, OptionTypes.Call, expiryDate, asset, 456));
            _model.Add(CreateStrike(40000, 34, 45, OptionTypes.Call, expiryDate, asset, 4));
            _model.Add(CreateStrike(45000, 3566, 51, OptionTypes.Call, expiryDate, asset, 67));
            _model.Add(CreateStrike(50000, 454, 57, OptionTypes.Call, expiryDate, asset, null));
            _model.Add(CreateStrike(55000, 10, 59, OptionTypes.Call, expiryDate, asset, 334));

            _model.Add(CreateStrike(05000, 10, 50, OptionTypes.Put, expiryDate, asset, 100));
            _model.Add(CreateStrike(10000, 10, 47, OptionTypes.Put, expiryDate, asset, 343));
            _model.Add(CreateStrike(15000, 6788, 42, OptionTypes.Put, expiryDate, asset, 3454));
            _model.Add(CreateStrike(20000, 10, 37, OptionTypes.Put, expiryDate, asset, null));
            _model.Add(CreateStrike(25000, 567, 32, OptionTypes.Put, expiryDate, asset, 100));
            _model.Add(CreateStrike(30000, 4577, 30, OptionTypes.Put, expiryDate, asset, 55));
            _model.Add(CreateStrike(35000, 67835, 32, OptionTypes.Put, expiryDate, asset, 456));
            _model.Add(CreateStrike(40000, 13245, 35, OptionTypes.Put, expiryDate, asset, 4));
            _model.Add(CreateStrike(45000, 10, 37, OptionTypes.Put, expiryDate, asset, 67));
            _model.Add(CreateStrike(50000, 454, 39, OptionTypes.Put, expiryDate, asset, null));
            _model.Add(CreateStrike(55000, 10, 41, OptionTypes.Put, expiryDate, asset, 334));

            //
            // draw test data on the smile chart

            RefreshSmile(new DateTime(2014, 08, 15));
        }
示例#5
0
        public MainWindow()
        {
            InitializeComponent();

            var assetsSource  = new ObservableCollectionEx <Security>();
            var optionsSource = new ObservableCollectionEx <Security>();

            Options.ItemsSource = optionsSource;
            Assets.ItemsSource  = assetsSource;

            _assets  = new ThreadSafeObservableCollection <Security>(assetsSource);
            _options = new ThreadSafeObservableCollection <Security>(optionsSource);

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

            var timer = new DispatcherTimer {
                Interval = TimeSpan.FromSeconds(5)
            };

            timer.Tick += (sender, args) =>
            {
                if (!_isDirty)
                {
                    return;
                }

                _isDirty = false;
                RefreshChart();
            };
            timer.Start();

            //
            // добавляем тестовый данные для отображения графика

            var asset = new Security {
                Id = "RIM4@FORTS"
            };

            Connector = new FakeConnector(new[] { asset });

            PosChart.AssetPosition = new Position
            {
                Security     = asset,
                CurrentValue = -1,
            };

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            var expDate = new DateTime(2014, 6, 14);

            PosChart.Positions.Add(new Position
            {
                Security = new Security {
                    Code = "RI C 110000", Strike = 110000, ImpliedVolatility = 45, OptionType = OptionTypes.Call, ExpiryDate = expDate, Board = ExchangeBoard.Forts, UnderlyingSecurityId = asset.Id
                },
                CurrentValue = 10,
            });
            PosChart.Positions.Add(new Position
            {
                Security = new Security {
                    Code = "RI P 95000", Strike = 95000, ImpliedVolatility = 30, OptionType = OptionTypes.Put, ExpiryDate = expDate, Board = ExchangeBoard.Forts, UnderlyingSecurityId = asset.Id
                },
                CurrentValue = -3,
            });

            PosChart.Refresh(100000, 10, new DateTime(2014, 5, 5), expDate);

            Instance = this;
        }
示例#6
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            var isDde = IsDde.IsChecked == true;

            if (isDde && Path.Text.IsEmpty())
            {
                MessageBox.Show(this, LocalizedStrings.Str2969);
                return;
            }

            if (Connector != null && !(Connector is FakeConnector))
            {
                return;
            }

            PosChart.Positions.Clear();
            PosChart.AssetPosition = null;
            PosChart.Refresh(1, 1, default(DateTimeOffset), default(DateTimeOffset));

            // создаем подключение
            Connector = new QuikTrader(Path.Text)
            {
                IsDde = isDde
            };

            if (isDde)
            {
                // изменяем метаданные так, чтобы начали обрабатывать дополнительные колонки опционов
                var columns = ((QuikTrader)Connector).SecuritiesTable.Columns;
                columns.Add(DdeSecurityColumns.Strike);
                columns.Add(DdeSecurityColumns.ImpliedVolatility);
                columns.Add(DdeSecurityColumns.UnderlyingSecurity);
                columns.Add(DdeSecurityColumns.TheorPrice);
                columns.Add(DdeSecurityColumns.OptionType);
                columns.Add(DdeSecurityColumns.ExpiryDate);
            }

            //_trader = new PlazaTrader { IsCGate = true };
            //_trader.Tables.Add(_trader.TableRegistry.Volatility);

            Portfolio.Connector = Connector;

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            // добавляем базовые активы в список
            Connector.NewSecurities += securities =>
                                       _assets.AddRange(securities.Where(s => s.Type == SecurityTypes.Future));

            Connector.SecuritiesChanged += securities =>
            {
                if ((PosChart.AssetPosition != null && securities.Contains(PosChart.AssetPosition.Security)) || PosChart.Positions.Cache.Select(p => p.Security).Intersect(securities).Any())
                {
                    _isDirty = true;
                }
            };

            // подписываемся на событие новых сделок чтобы обновить текущую цену фьючерса
            Connector.NewTrades += trades =>
            {
                var assetPos = PosChart.AssetPosition;
                if (assetPos != null && trades.Any(t => t.Security == assetPos.Security))
                {
                    _isDirty = true;
                }
            };

            Connector.NewPositions += positions => this.GuiAsync(() =>
            {
                var asset = SelectedAsset;

                if (asset == null)
                {
                    return;
                }

                var assetPos = positions.FirstOrDefault(p => p.Security == asset);
                var newPos   = positions.Where(p => p.Security.UnderlyingSecurityId == asset.Id).ToArray();

                if (assetPos == null && newPos.Length == 0)
                {
                    return;
                }

                if (assetPos != null)
                {
                    PosChart.AssetPosition = assetPos;
                }

                if (newPos.Length > 0)
                {
                    PosChart.Positions.AddRange(newPos);
                }

                RefreshChart();
            });

            Connector.PositionsChanged += positions => this.GuiAsync(() =>
            {
                if ((PosChart.AssetPosition != null && positions.Contains(PosChart.AssetPosition)) || positions.Intersect(PosChart.Positions.Cache).Any())
                {
                    RefreshChart();
                }
            });

            Connector.Connect();
        }
示例#7
0
        public MainWindow()
        {
            InitializeComponent();

            var assetsSource  = new ObservableCollectionEx <Security>();
            var optionsSource = new ObservableCollectionEx <Security>();

            Options.ItemsSource = optionsSource;
            Assets.ItemsSource  = assetsSource;

            _assets  = new ThreadSafeObservableCollection <Security>(assetsSource);
            _options = new ThreadSafeObservableCollection <Security>(optionsSource);

            var timer = new DispatcherTimer {
                Interval = TimeSpan.FromSeconds(5)
            };

            timer.Tick += (sender, args) =>
            {
                if (!_isDirty)
                {
                    return;
                }

                _isDirty = false;
                RefreshChart();
            };
            timer.Start();

            //
            // draw test data on the pos chart

            var asset = new Security {
                Id = "RIM4@FORTS"
            };

            Connector = new FakeConnector(new[] { asset });

            PosChart.AssetPosition = new Position
            {
                Security     = asset,
                CurrentValue = -1,
            };

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            var expDate = new DateTime(2014, 6, 14);

            PosChart.Positions.Add(new Position
            {
                Security = new Security {
                    Code = "RI C 110000", Strike = 110000, ImpliedVolatility = 45, OptionType = OptionTypes.Call, ExpiryDate = expDate, Board = ExchangeBoard.Forts, UnderlyingSecurityId = asset.Id
                },
                CurrentValue = 10,
            });
            PosChart.Positions.Add(new Position
            {
                Security = new Security {
                    Code = "RI P 95000", Strike = 95000, ImpliedVolatility = 30, OptionType = OptionTypes.Put, ExpiryDate = expDate, Board = ExchangeBoard.Forts, UnderlyingSecurityId = asset.Id
                },
                CurrentValue = -3,
            });

            PosChart.Refresh(100000, 10, new DateTime(2014, 5, 5), expDate);

            //
            // draw test data on the desk

            var expiryDate = new DateTime(2014, 09, 15);

            Desk.MarketDataProvider = Connector;
            Desk.SecurityProvider   = Connector;
            Desk.CurrentTime        = new DateTime(2014, 08, 15);

            Desk.Options = new[]
            {
                CreateStrike(05000, 10, 60, OptionTypes.Call, expiryDate, asset, 100),
                CreateStrike(10000, 10, 53, OptionTypes.Call, expiryDate, asset, 343),
                CreateStrike(15000, 10, 47, OptionTypes.Call, expiryDate, asset, 3454),
                CreateStrike(20000, 78, 42, OptionTypes.Call, expiryDate, asset, null),
                CreateStrike(25000, 32, 35, OptionTypes.Call, expiryDate, asset, 100),
                CreateStrike(30000, 3245, 32, OptionTypes.Call, expiryDate, asset, 55),
                CreateStrike(35000, 3454, 37, OptionTypes.Call, expiryDate, asset, 456),
                CreateStrike(40000, 34, 45, OptionTypes.Call, expiryDate, asset, 4),
                CreateStrike(45000, 3566, 51, OptionTypes.Call, expiryDate, asset, 67),
                CreateStrike(50000, 454, 57, OptionTypes.Call, expiryDate, asset, null),
                CreateStrike(55000, 10, 59, OptionTypes.Call, expiryDate, asset, 334),

                CreateStrike(05000, 10, 50, OptionTypes.Put, expiryDate, asset, 100),
                CreateStrike(10000, 10, 47, OptionTypes.Put, expiryDate, asset, 343),
                CreateStrike(15000, 6788, 42, OptionTypes.Put, expiryDate, asset, 3454),
                CreateStrike(20000, 10, 37, OptionTypes.Put, expiryDate, asset, null),
                CreateStrike(25000, 567, 32, OptionTypes.Put, expiryDate, asset, 100),
                CreateStrike(30000, 4577, 30, OptionTypes.Put, expiryDate, asset, 55),
                CreateStrike(35000, 67835, 32, OptionTypes.Put, expiryDate, asset, 456),
                CreateStrike(40000, 13245, 35, OptionTypes.Put, expiryDate, asset, 4),
                CreateStrike(45000, 10, 37, OptionTypes.Put, expiryDate, asset, 67),
                CreateStrike(50000, 454, 39, OptionTypes.Put, expiryDate, asset, null),
                CreateStrike(55000, 10, 41, OptionTypes.Put, expiryDate, asset, 334)
            };

            Desk.RefreshOptions();

            //
            // draw test data on the smile chart

            var puts  = SmileChart.CreateSmile("RIM4 (Put)", Colors.DarkRed);
            var calls = SmileChart.CreateSmile("RIM4 (Call)", Colors.DarkGreen);

            foreach (var option in Desk.Options)
            {
                if (option.Strike == null || option.ImpliedVolatility == null)
                {
                    continue;
                }

                (option.OptionType == OptionTypes.Put ? puts : calls).Add(new LineData <double> {
                    X = (double)option.Strike.Value, Y = option.ImpliedVolatility.Value
                });
            }

            Instance = this;
        }
示例#8
0
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (Connector != null && !(Connector is FakeConnector))
            {
                return;
            }

            PosChart.Positions.Clear();
            PosChart.AssetPosition = null;
            PosChart.Refresh(1, 1, default(DateTimeOffset), default(DateTimeOffset));

            // create connection
            Connector = new QuikTrader();

            //_trader = new PlazaTrader { IsCGate = true };
            //_trader.Tables.Add(_trader.TableRegistry.Volatility);

            Portfolio.Portfolios = new PortfolioDataSource(Connector);

            PosChart.MarketDataProvider = Connector;
            PosChart.SecurityProvider   = Connector;

            // fill underlying asset's list
            Connector.NewSecurity += security =>
            {
                if (security.Type == SecurityTypes.Future)
                {
                    _assets.Add(security);
                }
            };

            Connector.SecurityChanged += security =>
            {
                if ((PosChart.AssetPosition != null && PosChart.AssetPosition.Security == security) || PosChart.Positions.Cache.Select(p => p.Security).Contains(security))
                {
                    _isDirty = true;
                }
            };

            // subscribing on tick prices and updating asset price
            Connector.NewTrade += trade =>
            {
                var assetPos = PosChart.AssetPosition;
                if (assetPos != null && trade.Security == assetPos.Security)
                {
                    _isDirty = true;
                }
            };

            Connector.NewPosition += position => this.GuiAsync(() =>
            {
                var asset = SelectedAsset;

                if (asset == null)
                {
                    return;
                }

                var assetPos = position.Security == asset;
                var newPos   = position.Security.UnderlyingSecurityId == asset.Id;

                if (!assetPos && !newPos)
                {
                    return;
                }

                if (assetPos)
                {
                    PosChart.AssetPosition = position;
                }

                if (newPos)
                {
                    PosChart.Positions.Add(position);
                }

                RefreshChart();
            });

            Connector.PositionChanged += position => this.GuiAsync(() =>
            {
                if ((PosChart.AssetPosition != null && PosChart.AssetPosition == position) || PosChart.Positions.Cache.Contains(position))
                {
                    RefreshChart();
                }
            });

            Connector.Connect();
        }