public SaveBidAndOfferHandler(string symbol, OrderBookContext orderBook, int maxIndex, ILogger logger) { this.symbol = symbol; this.orderBook = orderBook; this.logger = logger; this.currentIndex = 0; this.maxIndex = maxIndex; this.orderBook.OnQuotesUpdate += new SymbolDataUpdatedNotification(OnChange); }
/// <summary> /// /// </summary> /// <param name="strategyHeader">Стратегия</param> /// <param name="orderBook"></param> /// <param name="signalQueue">Обозреваемая очередь сигналов</param> /// <param name="tradingData">Торговых данных контекст</param> /// <param name="logger">Логгер</param> public OpenPositionOnOrderBookChange(StrategyHeader strategyHeader, OrderBookContext orderBook, ObservableQueue <Signal> signalQueue, TradingDataContext tradingData, ILogger logger) { this.strategyHeader = strategyHeader; this.orderBook = orderBook; this.signalQueue = signalQueue; this.tradingData = tradingData; this.logger = logger; this.orderBook.OnQuotesUpdate += new SymbolDataUpdatedNotification(OnChange); }
private void InternalGetOrderBook(IOrderBookProvider provider, OrderBookContext context, bool priceLessThan1) { var r = AsyncContext.Run(() => provider.GetOrderBookAsync(context)); Assert.IsTrue(r != null, "Null response returned"); if (r.IsReversed) { Trace.WriteLine("Asset pair is reversed"); } // Assert.IsTrue(r.Pair.Equals(context.Pair), "Incorrect asset pair returned"); Assert.IsTrue(r.Asks.Count > 0, "No asks returned"); Assert.IsTrue(r.Bids.Count > 0, "No bids returned"); Assert.IsTrue(r.Asks.Count <= context.MaxRecordsCount, "Incorrect number of ask order book records returned"); Assert.IsTrue(r.Bids.Count <= context.MaxRecordsCount, "Incorrect number of bid order book records returned"); //if (context.MaxRecordsCount == Int32.MaxValue) // Assert.IsTrue(r.Count > 0, "No order book records returned"); //else // Assert.IsTrue(r.Asks.Count == context.MaxRecordsCount && r.Bids.Count == context.MaxRecordsCount, "Incorrect number of order book records returned"); Trace.WriteLine($"Highest bid: {r.HighestBid}"); Trace.WriteLine($"Lowest ask: {r.LowestAsk}"); var records = new List <OrderBookRecord>() { r.LowestAsk, r.HighestBid }; foreach (var record in records) { if (priceLessThan1) // Checks if the pair is reversed (price-wise). { Assert.IsTrue(record.Price < 1, "Reverse check failed. Price is expected to be < 1"); } else { Assert.IsTrue(record.Price > 1, "Reverse check failed. Price is expected to be > 1"); } } Trace.WriteLine($"Order book data ({r.Asks.Count} asks, {r.Bids.Count} bids): "); foreach (var obr in r.Asks.Concat(r.Bids)) { Trace.WriteLine($"{obr.UtcUpdated} : {obr}"); } }
private void GetOrderBook(IOrderBookProvider provider, AssetPair pair, bool priceLessThan1, int recordsCount = 100) { try { var context = new OrderBookContext(pair, recordsCount); InternalGetOrderBook(provider, context, priceLessThan1); context = new OrderBookContext(pair, Int32.MaxValue); InternalGetOrderBook(provider, context, priceLessThan1); } catch (Exception e) { Assert.Fail(e.Message); } }
public static double GetBidVolumeSum(this OrderBookContext orderBook, string symbol, int depth = 50) { double sum = 0; if (depth > orderBook.Depth) { depth = orderBook.Depth; } for (int i = 0; i < depth; i++) { sum += orderBook.GetBidVolume(symbol, i); } return(sum); }
public BuySpreadOnQuoteChange(OrderBookContext quotesProvider, IEnumerable <StrategyHeader> leftLeg, IEnumerable <StrategyHeader> rightLeg, SpreadSettings spreadSettings, IDataContext dataContext, ObservableQueue <Signal> signalQueue, ILogger logger) { this.quotesProvider = quotesProvider; this.leftLeg = leftLeg; this.rightLeg = rightLeg; this.spreadSettings = spreadSettings; this.tradingData = dataContext; this.signalQueue = signalQueue; this.logger = logger; this.quotesProvider.OnQuotesUpdate += new SymbolDataUpdatedNotification(quotesProvider_OnQuotesUpdate); }
public void Setup() { this.strategyHeader = this.tradingData.Get <IEnumerable <StrategyHeader> >().Single(s => s.Id == 1); this.orderBook = new OrderBookContext(); this.tradingData.Get <ObservableCollection <Tick> >().Add(new Tick("RTS-12.13_FT", new DateTime(2013, 12, 3, 10, 0, 0), 138000, 3600)); this.orderBook.Update(0, this.strategyHeader.Symbol, 138000, 100, 138010, 50); FollowTrendOnTick handler = new FollowTrendOnTick(this.strategyHeader, 30, 50, this.orderBook, this.tradingData, this.signalQueue, new NullLogger()); }
public FollowTrendOnTick(StrategyHeader strategyHeader, int seconds, double priceSpan, OrderBookContext orderBook, IDataContext tradingData, ObservableQueue <Signal> signalQueue, ILogger logger) : base(tradingData.Get <ObservableCollection <Tick> >()) { this.strategyHeader = strategyHeader; this.seconds = seconds; this.priceSpan = priceSpan; this.orderBook = orderBook; this.tradingData = tradingData; this.signalQueue = signalQueue; this.logger = logger; }
public void Setup() { this.leftLeg = new List <StrategyHeader>(); this.rigthLeg = new List <StrategyHeader>(); this.leftStrategy = new StrategyHeader(1, "Left leg", "BP12345-RF-01", "AB", 10); this.rightStrategy = new StrategyHeader(2, "Right leg", "BP1235-RF-01", "BA", 10); this.leftLeg.Add(this.leftStrategy); this.rigthLeg.Add(this.rightStrategy); this.spreadSettings = new SpreadSettings(); this.arbitrageSettings = new ArbitrageSettings(1, this.leftLeg, this.rigthLeg, this.spreadSettings); this.orderBook = new OrderBookContext(); this.tradingData = new TradingDataContext(); CalculateSpreadOnOrderBookChange handler = new CalculateSpreadOnOrderBookChange(this.arbitrageSettings, this.orderBook, this.tradingData, new NullLogger()); }
private void InternalGetOrderBook(IOrderBookProvider provider, OrderBookContext context, bool priceLessThan1) { var r = AsyncContext.Run(() => provider.GetOrderBookAsync(context)); Assert.IsTrue(r != null, "Null response returned"); if (r.Pair.Reversed.Equals(context.Pair)) { Trace.WriteLine("Asset pair is reversed"); } // Assert.IsTrue(r.Pair.Equals(context.Pair), "Incorrect asset pair returned"); if (context.MaxRecordsCount == Int32.MaxValue) { Assert.IsTrue(r.Count > 0, "No order book records returned"); } else { Assert.IsTrue(r.Asks.Count == context.MaxRecordsCount && r.Bids.Count == context.MaxRecordsCount, "Incorrect number of order book records returned"); } foreach (var record in r.Asks.Take(1).Concat(r.Bids.Take(1))) { if (priceLessThan1) // Checks if the pair is reversed (price-wise). { Assert.IsTrue(record.Price < 1, "Reverse check failed. Price is expected to be < 1"); } else { Assert.IsTrue(record.Price > 1, "Reverse check failed. Price is expected to be > 1"); } } Trace.WriteLine($"Order book data ({r.Asks.Count} asks, {r.Bids.Count} bids): "); foreach (var obr in r.Asks.Concat(r.Bids)) { Trace.WriteLine($"{obr.UtcUpdated} | For {context.Pair.Asset1}: {obr.Type} {obr.Price.Display}, {obr.Volume} "); } }
public async Task <OrderBook> GetOrderBookAsync(OrderBookContext context) { var api = ApiProvider.GetApi(context); var pairCode = context.Pair.ToTicker(this, ""); var rRaw = context.MaxRecordsCount == Int32.MaxValue ? await api.GetOrderBookAsync(pairCode, 0).ConfigureAwait(false) : await api.GetOrderBookAsync(pairCode, context.MaxRecordsCount).ConfigureAwait(false); CheckResponseErrors(rRaw); var r = rRaw.GetContent(); var buyAction = "buy"; var sellAction = "sell"; var buys = context.MaxRecordsCount == Int32.MaxValue ? r.Where(x => x.side.ToLower().Equals(buyAction)).OrderBy(x => x.id).ToList() : r.Where(x => x.side.Equals(buyAction, StringComparison.OrdinalIgnoreCase)).OrderBy(x => x.id) .Take(context.MaxRecordsCount).ToList(); var sells = context.MaxRecordsCount == Int32.MaxValue ? r.Where(x => x.side.ToLower().Equals(sellAction)).OrderBy(x => x.id).ToList() : r.Where(x => x.side.Equals(sellAction, StringComparison.OrdinalIgnoreCase)).OrderBy(x => x.id) .Take(context.MaxRecordsCount).ToList(); var orderBook = new OrderBook(Network, context.Pair); foreach (var i in buys) { orderBook.AddBid(i.price, i.size); } foreach (var i in sells) { orderBook.AddAsk(i.price, i.size); } return(orderBook); }
public void Setup() { this.qProvider = new OrderBookContext(); this.spreadSettings = new SpreadSettings(1.35, 1.48, 1.18); this.leftLeg = new List <StrategyHeader>(); this.leftLeg.Add(this.tradingData.Get <IEnumerable <StrategyHeader> >().Single(s => s.Id == 1)); this.rightLeg = new List <StrategyHeader>(); this.rightLeg.Add(this.tradingData.Get <IEnumerable <StrategyHeader> >().Single(s => s.Id == 2)); this.rightLeg.Add(this.tradingData.Get <IEnumerable <StrategyHeader> >().Single(s => s.Id == 3)); CoverSpreadOnQuoteChange handler = new CoverSpreadOnQuoteChange(this.qProvider, this.leftLeg, this.rightLeg, this.spreadSettings, this.tradingData, this.signalQueue, new NullLogger()); }
private OrderbookMarketParameters marketparams; // рыночные параметры для стратегии public MarketMakerHandlerOnBidAskNoR(Strategy strategy, TradingDataContext tradingData, OrderBookContext orderBook, ObservableQueue<Signal> signalQueue, Logger logger) : base(tradingData.Get<ObservableCollection<BidAsk>>()) { this.strategy = strategy; this.orderBook = orderBook; this.signalQueue = signalQueue; this.tradingData = tradingData; this.logger = logger; this.strategyInitialAmount = this.strategy.Amount; this.oplimits = this.tradingData.Get<IEnumerable<OpenPositionLimitSettings>>().SingleOrDefault(s => s.StrategyId == this.strategy.Id); this.obDepth = AppSettings.GetValue<int>("OrderBookDepth"); this.politics = new HashSet<MarketMakerPolitic>(new PoliticCollectionFactory(AppSettings.GetStringValue("politicsFileName")).Make()); this.marketparams = new OrderBookMarketParametersFactory(AppSettings.GetStringValue("marketparamsFileName")).Make().First(); }
public async Task<OrderBook> GetOrderBookAsync(OrderBookContext context) { var api = ApiProvider.GetApi(context); var pairCode = context.Pair.ToTicker(this); var r = await api.GetOrderBookAsync(pairCode).ConfigureAwait(false); var orderBook = new OrderBook(Network, context.Pair); var maxCount = Math.Min(1000, context.MaxRecordsCount); var response = r.payload; var asks = response.asks.Take(maxCount); var bids = response.bids.Take(maxCount); foreach (var i in bids) orderBook.AddBid(i.price, i.amount, true); foreach (var i in asks) orderBook.AddAsk(i.price, i.amount, true); return orderBook; }
public async Task <OrderBook> GetOrderBookAsync(OrderBookContext context) { var api = ApiProvider.GetApi(context); var pairCode = context.Pair.ToTicker(this, ""); var r = context.MaxRecordsCount.HasValue ? await api.GetOrderBookAsync(pairCode, context.MaxRecordsCount.Value).ConfigureAwait(false) : await api.GetOrderBookAsync(pairCode, 0).ConfigureAwait(false); var buyAction = "buy"; var sellAction = "sell"; var buys = context.MaxRecordsCount.HasValue ? r.Where(x => x.side.ToLower().Equals(buyAction)).OrderBy(x => x.id) .Take(context.MaxRecordsCount.Value / 2).ToList() : r.Where(x => x.side.ToLower().Equals(buyAction)).OrderBy(x => x.id).ToList(); var sells = context.MaxRecordsCount.HasValue ? r.Where(x => x.side.ToLower().Equals(sellAction)).OrderBy(x => x.id) .Take(context.MaxRecordsCount.Value / 2).ToList() : r.Where(x => x.side.ToLower().Equals(sellAction)).OrderBy(x => x.id).ToList(); var orderBook = new OrderBook(Network, context.Pair); foreach (var i in buys) { orderBook.Add(new OrderBookRecord(OrderType.Bid, new Money(i.price, context.Pair.Asset2), i.size)); } foreach (var i in sells) { orderBook.Add(new OrderBookRecord(OrderType.Ask, new Money(i.price, context.Pair.Asset2), i.size)); } return(orderBook); }
public async Task <OrderBook> GetOrderBookAsync(OrderBookContext context) { var api = ApiProvider.GetApi(context); var pair = context.Pair.ToTicker(this); var r = context.MaxRecordsCount == Int32.MaxValue ? await api.GetOrderBookAsync(pair).ConfigureAwait(false) : await api.GetOrderBookAsync(pair, context.MaxRecordsCount).ConfigureAwait(false); var orderBook = new OrderBook(Network, context.Pair); foreach (var rAsk in r.asks.Select(ParseOrderBookData)) { orderBook.AddAsk(rAsk.Price, rAsk.Volume, true); } foreach (var rBid in r.bids.Select(ParseOrderBookData)) { orderBook.AddBid(rBid.Price, rBid.Volume, true); } return(orderBook); }
public async Task <OrderBook> GetOrderBookAsync(OrderBookContext context) { CheckInputAssetPair(context.Pair); var api = ApiProvider.GetApi(context); var orderBook = new OrderBook(Network, context.Pair); var maxCount = Math.Min(1000, context.MaxRecordsCount); var r = await api.GetOrderBookAsync(context.Pair.Asset1.ShortCode.ToLower()).ConfigureAwait(false); foreach (var rBid in r.bid.Take(maxCount).Select(x => ParseOrderBookRecords(x, context.Pair))) { orderBook.AddBid(rBid.Price, rBid.Volume, true); } foreach (var rAsk in r.ask.Take(maxCount).Select(x => ParseOrderBookRecords(x, context.Pair))) { orderBook.AddAsk(rAsk.Price, rAsk.Volume, true); } return(orderBook); }
public void RecordOrderBooksInDB(Dictionary <string, OrderBook> orderBooks) { logger.Debug($"Запущен {MethodBase.GetCurrentMethod()}"); using (var db = new OrderBookContext()) { var transaction = db.Database.BeginTransaction(); try { db.OrderBooks.AddRange(orderBooks.Values); db.SaveChanges(); transaction.Commit(); logger.Debug($"{MethodBase.GetCurrentMethod()} успешно отработал"); } catch (Exception ex) { logger.Error($"err, при записи OrderBook в бд возникла ошибка: {ex.Message}"); transaction.Rollback(); } } }
public void Setup() { this.qProvider = new OrderBookContext(); this.leftLeg = new List <string>(); this.rightLeg = new List <string>(); }
public UpdateOrderBookOnBidAsk(OrderBookContext storage, IDataContext context, ILogger logger) : base(context.Get <ObservableCollection <BidAsk> >()) { this.storage = storage; this.logger = logger; }
public MarketDataProvider(SmartComHandlersDatabase handlers, IDataContext tradingData, OrderBookContext orderBook, ILogger logger) { this.handlers = handlers; this.tradingData = tradingData; this.logger = logger; this.orderBook = orderBook; this.handlers.Add <_IStClient_AddTickEventHandler>(stServer_AddTick); this.handlers.Add <_IStClient_UpdateBidAskEventHandler>(stServer_UpdateBidAsk); this.handlers.Add <_IStClient_AddBarEventHandler>(stServer_AddBar); }
public void Setup() { this.orderBook = new OrderBookContext(); }