public void MarketOrder(SignalInfo signal, IExpert adv) { try { if (adv == null) { return; } // decimal priceInOrder = Math.Round(tool.LastPrice + tool.Step * 5, tool.PriceAccuracy); // decimal priceInOrder = 0;// Math.Round(tool.LastPrice, tool.PriceAccuracy); int qty = (int)adv.Volume(); var portfolio = Portfolios.Where(x => x.Name == adv.AccountName()).FirstOrDefault(); if (!Trader.RegisteredPortfolios.Contains(portfolio)) { Trader.RegisterPortfolio(portfolio); } Order order = new Order(); order.Type = OrderTypes.Market; var securities = Securities.Where(x => x.Code == adv.Symbol()); if (securities != null && securities.Count() > 0) { order.Security = securities.FirstOrDefault(); } else { order.Security = new Security(); order.Security.Code = adv.Symbol(); order.Security.Id = adv.Symbol() + "@FORTS"; } order.Comment = adv.Comment(); order.Portfolio = portfolio; if (!Trader.RegisteredSecurities.Contains(order.Security)) { Trader.RegisterSecurity(order.Security); Trader.RegisterTrades(order.Security); } order.Volume = qty; order.Direction = signal.Value == 0 ? Sides.Buy : Sides.Sell; Log( $"Expert <{adv.AccountName()}> On {adv.Symbol()} {order.Direction.ToString()} Register order: lots=" + qty); Trader.RegisterOrder(order); } catch (Exception e) { Log($"Expert <{adv.AccountName()}> Error registering order: " + e); } }
private void ProcessPortfolioLookupResultMessage(PortfolioLookupResultMessage message) { if (message.Error != null) RaiseError(message.Error); var criteria = _portfolioLookups.TryGetValue(message.OriginalTransactionId); if (criteria == null) return; RaiseLookupPortfoliosResult(message.Error, Portfolios.Where(pf => pf.Name.CompareIgnoreCase(criteria.PortfolioName))); }
/// <summary> /// Сохранить настройки. /// </summary> /// <param name="storage">Хранилище настроек.</param> public override void Save(SettingsStorage storage) { storage.SetValue("InnerSessions", InnerSessions.Select(s => { var settings = s.SaveEntire(true); settings.SetValue("Priority", InnerSessions[s]); settings.SetValue("Portfolios", Portfolios.Where(p => p.Value == s).Select(p => p.Key).ToArray()); return(settings); }).ToArray()); base.Save(storage); }
public static void UpdateInstrument(QuikConnectionManager.DynamicInstrument obj) { try { var i = Instruments.First(k => k.Id == obj.Id); i.Update(obj.LastPrice, obj.Volatility, obj.TheorPrice, 0, obj.Ask, obj.AskVol, obj.Bid, obj.BidVol); if (i.Type == Entities.InstrumentType.Futures) { foreach (Entities.Instrument ins in Instruments) { if (ins.BaseContract == i.Code) { ins.SettlePrice = i.LastPrice; } } } if (Portfolios.Any(k => k.BaseCode == i.Code)) { foreach (Entities.Portfolio p in Portfolios.Where(k => k.BaseCode == i.Code)) { p.Refresh(); } } //i.LastPrice = obj.LastPrice; //i.Volatility = obj.Volatility; //i.TheorPrice = obj.TheorPrice; //i.BestAsk = obj.Ask; //i.BestAskVolume = obj.AskVol; //i.BestBid = obj.Bid; //i.BestBidVolume = obj.BidVol; } catch (SystemException e) { log.Error("Update for unknown instrument Id={0}", obj.Id); } }
public Portfolio GetPortfolioById(int portfolioId) { return(Portfolios.Where(p => p.Id == portfolioId).SingleOrDefault()); }
public bool Connect(Terminal toTerminal) { try { if (Trader == null) { // создаем подключение Trader = new QuikTrader { IsDde = false, Path = toTerminal.FullPath }; /* * { * LuaFixServerAddress = Address.Text.To<EndPoint>(), * LuaLogin = Login.Text, * LuaPassword = Password.Password.To<SecureString>() * }; */ Trader.LogLevel = LogLevels.Info; _logManager.Sources.Add(Trader); _logManager.Listeners.Add(new FileLogListener("XTrade.Quik.log")); // отключение автоматического запроса всех инструментов. Trader.RequestAllSecurities = false; // возводим флаг, что соединение установлено _isConnected = true; // переподключение будет работать только во время работы биржи РТС // (чтобы отключить переподключение когда торгов нет штатно, например, ночью) Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime; // подписываемся на событие об успешном восстановлении соединения Trader.Restored += () => { Log("Connection restored"); }; // MessageBox.Show(this, LocalizedStrings.Str2958)); // подписываемся на событие разрыва соединения Trader.ConnectionError += error => { Log(error.ToString()); }; //this.GuiAsync(() => MessageBox.Show(this, error.ToString())); // подписываемся на ошибку обработки данных (транзакций и маркет) Trader.Error += error => { Log(error.ToString()); }; // this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных")); // подписываемся на ошибку подписки маркет-данных Trader.MarketDataSubscriptionFailed += (security, msg, error) => { Log(error.ToString()); }; // this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(msg.DataType, security))); Trader.NewSecurity += Securities.Add; //Trader.NewMyTrade += _myTradesWindow.TradeGrid.Trades.Add; //Trader.NewTrade += _tradesWindow.TradeGrid.Trades.Add; Trader.NewOrder += Orders.Add; Trader.NewStopOrder += Orders.Add; //Trader.OrderRegisterFailed += _ordersWindow.OrderGrid.AddRegistrationFail; //Trader.StopOrderRegisterFailed += _stopOrdersWindow.OrderGrid.AddRegistrationFail; Trader.OrderCancelFailed += fail => { Log(fail.Error.Message); }; // this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981)); Trader.StopOrderCancelFailed += fail => { Log(fail.Error.Message); }; //this.GuiAsync(() => MessageBox.Show(this, fail.Error.Message, LocalizedStrings.Str2981)); Trader.NewPortfolio += Portfolios.Add; Trader.NewPosition += Positions.Add; Trader.MassOrderCancelFailed += (transId, error) => { Log(error.ToString()); }; //this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str716)); // устанавливаем поставщик маркет-данных // _securitiesWindow.SecurityPicker.MarketDataProvider = Trader; //ShowSecurities.IsEnabled = ShowTrades.IsEnabled = // ShowMyTrades.IsEnabled = ShowOrders.IsEnabled = // ShowPortfolios.IsEnabled = ShowStopOrders.IsEnabled = true; Trader.Connect(); _isConnected = true; bStopJobs = false; terminal = toTerminal; //var advs = MainService.thisGlobal.GetAdvisersByTerminal(terminal.Id); Portfolio portfolio = null; try { var res = service.GetAdvisers().Where(x => x.TerminalId == toTerminal.Id); foreach (var adv in res) { if (!adv.Disabled) { QUIKExpert quikE = new QUIKExpert(adv); advisers.Add(adv.Id, quikE); service.SubscribeToSignals(adv.Id); if (string.IsNullOrEmpty(adv.State)) { adv.State = quikE.Serialize(); service.UpdateAdviser(adv); } if (portfolio == null) { portfolio = Portfolios.Where(x => x.Name == quikE.PortfolioName).FirstOrDefault(); } } } Log("Successfully connected to <QUIK>"); } catch (Exception e) { log.Error(e); } return(true); } Trader.Disconnect(); _isConnected = false; return(false); } catch (Exception e) { Log(e.ToString()); } return(false); }