internal void Update(SingleAdviser <int> firstAdviser, SingleAdviser <int> secondAdviser) { Level2 f = firstAdviser.GetLevel2(m_symbol); Level2 s = secondAdviser.GetLevel2(m_symbol); if (!f.Exist || !s.Exist) { return; } if (!f.HasBeenChanged && !s.HasBeenChanged) { return; } int key = StrategyPairTransactionInfo.GetKey(firstAdviser.Tag, secondAdviser.Tag); StrategyPairTransactionInfo sPairs = null; if (!dictSPairs.TryGetValue(key, out sPairs)) { sPairs = new StrategyPairTransactionInfo(); { dictSPairs.Add(key, sPairs); } } Run(firstAdviser, secondAdviser, s, f, ref sPairs.m_firstBidSecondAskArbitrage); }
internal Order(SingleAdviser <int> adviser, string symbol, double requestedPrice, double requestedVolume, OrderType type, TradeSide side) { m_volume = requestedVolume; m_adviser = adviser; m_symbol = symbol; m_requestedPrice = requestedPrice; m_type = type; m_side = side; }
protected override void OnUpdate(SingleAdviser <int> adviser) { string symbol = "EUR/USD"; Level2 first = m_first.GetLevel2(symbol); Order sell = new Order(m_first, symbol, first.Bid, cVolume, OrderType.Market, TradeSide.Sell); sell.Run(); sell.Join(); }
internal Order(SingleAdviser<int> adviser, string symbol, double requestedPrice, double requestedVolume, OrderType type, TradeSide side) { m_volume = requestedVolume; m_adviser = adviser; m_symbol = symbol; m_requestedPrice = requestedPrice; m_type = type; m_side = side; }
internal Transaction(string symbol, SingleAdviser <int> first, SingleAdviser <int> second) { m_start = DateTime.UtcNow; m_first = first.Tag; m_second = second.Tag; m_precision = Math.Min(first.Symbols[symbol].Precision, second.Symbols[symbol].Precision); m_builder.AppendFormat("{0}> symbol = {1}; first bank = {2}; second bank = {3}", UtcNow(m_start), symbol, first.Tag, second.Tag); m_builder.AppendLine(); }
internal Transaction(string symbol, SingleAdviser<int> first, SingleAdviser<int> second) { m_start = DateTime.UtcNow; m_first = first.Tag; m_second = second.Tag; m_precision = Math.Min(first.Symbols[symbol].Precision, second.Symbols[symbol].Precision); m_builder.AppendFormat("{0}> symbol = {1}; first bank = {2}; second bank = {3}", UtcNow(m_start), symbol, first.Tag, second.Tag); m_builder.AppendLine(); }
protected override void OnUpdate(SingleAdviser <int> adviser) { lock (m_synchronizer) { quotesCounter[adviser.Tag]++; for (int i = 0; i < m_listAdviser.Count; i++) //Array.For(0, m_listAdviser.Count, i => { if (adviser.Tag != m_listAdviser[i].Tag) { Parallel.ForEach <WatcherSymbol>(m_watchers, currSymbolWatcher => { currSymbolWatcher.Update(m_listAdviser[i], adviser); currSymbolWatcher.Update(adviser, m_listAdviser[i]); }); } } } }
protected override void OnUpdate(SingleAdviser <int> adviser) { lock (obj) { foreach (string currSymbol in listSymbols) { Level2 level2 = adviser.GetLevel2(currSymbol); if (!level2.Exist || level2.HasBeenChanged) { continue; } LastTask = LastTask.ContinueWith(ant => { DataFeedStorage dfs = dictKeyToStorage[GetKey(adviser.Tag, currSymbol)]; dfs.Import(level2.ToQuote().ToEnumerable(), false, true, true); } ); //listCodeToBankSaver[adviser.Tag].AddQuote(level2); } } }
internal void Update(SingleAdviser<int> firstAdviser, SingleAdviser<int> secondAdviser) { Level2 f = firstAdviser.GetLevel2(m_symbol); Level2 s = secondAdviser.GetLevel2(m_symbol); if (!f.Exist || !s.Exist) { return; } if (!f.HasBeenChanged && !s.HasBeenChanged) { return; } int key = StrategyPairTransactionInfo.GetKey(firstAdviser.Tag, secondAdviser.Tag); StrategyPairTransactionInfo sPairs = null; if (!dictSPairs.TryGetValue(key, out sPairs)) { sPairs = new StrategyPairTransactionInfo(); { dictSPairs.Add(key, sPairs); } } Run(firstAdviser, secondAdviser, s, f, ref sPairs.m_firstBidSecondAskArbitrage); }
private void Run(SingleAdviser<int> first, SingleAdviser<int> second, Level2 f, Level2 s, ref Arbitrage arb) { if ( f.Bids.Count == 0 || s.Asks.Count == 0 || s.Ask - f.Bid > -float.Epsilon) { if (null != arb) { arb.EndDateTime = DateTime.UtcNow; arb.Duration = (arb.EndDateTime - arb.StartDateTime).TotalMilliseconds; ArbitrageDetail prevArbDetail = arb.ArbitrageDetails.Last(); prevArbDetail.EndTickTime = arb.EndDateTime; prevArbDetail.duration = (prevArbDetail.EndTickTime - prevArbDetail.StartTickTime).TotalMilliseconds; double test = Math.Abs(arb.ArbitrageDetails.Sum(p => p.duration)); if (test - arb.Duration > 0.0000000001) { Console.WriteLine("DurationError"); } Arbitrage refArbitrage = arb; //Task.Factory.StartNew(() => //{ // using (Model.ArbitrageContext arbContext = new Model.ArbitrageContext()) // { // arbContext.Arbitrages.Add(refArbitrage); // arbContext.SaveChanges(); // } //}); arb = null; if (!dictSPairs.Any(p => p.Value.m_firstBidSecondAskArbitrage != null)) { ArbitrageTimeStatistics ars = ArbitrageTimeStatistics.Instance(f.Symbol); ars.TotalSecondsArbitradge += (DateTime.UtcNow - ars.StartArbitrageDateTime).TotalSeconds; ars.StartArbitrageDateTime = DateTime.MinValue; Console.WriteLine("Symbol={3}; ArbitrageTime={0} seconds; Percent={1}%; InHourSeconds={2}", ars.TotalSecondsArbitradge, ars.TotalSecondsArbitradge * 100 / (DateTime.UtcNow - ArbitrageTimeStatistics.StartAppDateTime).TotalSeconds, ars.TotalSecondsArbitradge * 3600 / (DateTime.UtcNow - ArbitrageTimeStatistics.StartAppDateTime).TotalSeconds, f.Symbol); } } } else { DateTime utcNow = DateTime.UtcNow; if (arb == null) arb = new Arbitrage(utcNow, first.Tag, second.Tag, m_symbol); ArbitrageDetail arbDetail = new ArbitrageDetail(utcNow); if (f.Asks.Count > 0) { arbDetail.B1Ask1 = f.Asks[0].Price; arbDetail.B1Ask1Volume = f.Asks[0].Volume; } arbDetail.B1Bid1 = f.Bids[0].Price; arbDetail.B1Bid1Volume = f.Bids[0].Volume; arbDetail.B2Ask1 = s.Asks[0].Price; arbDetail.B2Ask1Volume = s.Asks[0].Volume; if (s.Bids.Count > 0) { arbDetail.B2Bid1 = s.Bids[0].Price; arbDetail.B2Bid1Volume = s.Bids[0].Volume; } if (arb.ArbitrageDetails.Count != 0) { ArbitrageDetail previos = arb.ArbitrageDetails.Last(); previos.EndTickTime = arbDetail.StartTickTime; previos.duration = (previos.EndTickTime - previos.StartTickTime).TotalMilliseconds; } arbDetail.spread = s.Ask - f.Bid; arb.ArbitrageDetails.Add(arbDetail); if (ArbitrageTimeStatistics.Instance(f.Symbol).StartArbitrageDateTime == DateTime.MinValue) ArbitrageTimeStatistics.Instance(f.Symbol).StartArbitrageDateTime = DateTime.UtcNow; //CheckDoubleArbitrage(first.Tag, second.Tag); } }
protected override void OnDisconnected(SingleAdviser <int> adviser, string message) { string now = DateTime.Now.ToString("HHHH:mm:ss.fff"); Console.WriteLine("{0}: OnDisconnected({1})", now, adviser.Tag); }
private void Run(SingleAdviser <int> first, SingleAdviser <int> second, Level2 f, Level2 s, ref Arbitrage arb) { if (f.Bids.Count == 0 || s.Asks.Count == 0 || s.Ask - f.Bid > -float.Epsilon) { if (null != arb) { arb.EndDateTime = DateTime.UtcNow; arb.Duration = (arb.EndDateTime - arb.StartDateTime).TotalMilliseconds; ArbitrageDetail prevArbDetail = arb.ArbitrageDetails.Last(); prevArbDetail.EndTickTime = arb.EndDateTime; prevArbDetail.duration = (prevArbDetail.EndTickTime - prevArbDetail.StartTickTime).TotalMilliseconds; double test = Math.Abs(arb.ArbitrageDetails.Sum(p => p.duration)); if (test - arb.Duration > 0.0000000001) { Console.WriteLine("DurationError"); } Arbitrage refArbitrage = arb; //Task.Factory.StartNew(() => //{ // using (Model.ArbitrageContext arbContext = new Model.ArbitrageContext()) // { // arbContext.Arbitrages.Add(refArbitrage); // arbContext.SaveChanges(); // } //}); arb = null; if (!dictSPairs.Any(p => p.Value.m_firstBidSecondAskArbitrage != null)) { ArbitrageTimeStatistics ars = ArbitrageTimeStatistics.Instance(f.Symbol); ars.TotalSecondsArbitradge += (DateTime.UtcNow - ars.StartArbitrageDateTime).TotalSeconds; ars.StartArbitrageDateTime = DateTime.MinValue; Console.WriteLine("Symbol={3}; ArbitrageTime={0} seconds; Percent={1}%; InHourSeconds={2}", ars.TotalSecondsArbitradge, ars.TotalSecondsArbitradge * 100 / (DateTime.UtcNow - ArbitrageTimeStatistics.StartAppDateTime).TotalSeconds, ars.TotalSecondsArbitradge * 3600 / (DateTime.UtcNow - ArbitrageTimeStatistics.StartAppDateTime).TotalSeconds, f.Symbol); } } } else { DateTime utcNow = DateTime.UtcNow; if (arb == null) { arb = new Arbitrage(utcNow, first.Tag, second.Tag, m_symbol); } ArbitrageDetail arbDetail = new ArbitrageDetail(utcNow); if (f.Asks.Count > 0) { arbDetail.B1Ask1 = f.Asks[0].Price; arbDetail.B1Ask1Volume = f.Asks[0].Volume; } arbDetail.B1Bid1 = f.Bids[0].Price; arbDetail.B1Bid1Volume = f.Bids[0].Volume; arbDetail.B2Ask1 = s.Asks[0].Price; arbDetail.B2Ask1Volume = s.Asks[0].Volume; if (s.Bids.Count > 0) { arbDetail.B2Bid1 = s.Bids[0].Price; arbDetail.B2Bid1Volume = s.Bids[0].Volume; } if (arb.ArbitrageDetails.Count != 0) { ArbitrageDetail previos = arb.ArbitrageDetails.Last(); previos.EndTickTime = arbDetail.StartTickTime; previos.duration = (previos.EndTickTime - previos.StartTickTime).TotalMilliseconds; } arbDetail.spread = s.Ask - f.Bid; arb.ArbitrageDetails.Add(arbDetail); if (ArbitrageTimeStatistics.Instance(f.Symbol).StartArbitrageDateTime == DateTime.MinValue) { ArbitrageTimeStatistics.Instance(f.Symbol).StartArbitrageDateTime = DateTime.UtcNow; } //CheckDoubleArbitrage(first.Tag, second.Tag); } }