private void ForeachExchanges(Instrument instrument, Func <IExchange, IExchange, bool> action) { foreach (var ex1 in _exchanges.Values) { lock (ex1) { if (!instrument.ContainsOrders(ex1)) { continue; } foreach (var ex2 in ex1.Exchanges) { if (!instrument.ContainsOrders(ex2)) { continue; } lock (ex2) { if (action(ex1, ex2)) { break; } } } } } }
private bool TryToExchange(IExchange ex1, Instrument ins, out IExchange exBuy, out IExchange exSell) { var data = InitTransData(ins.GetBalanceStep(), ins); exBuy = null; exSell = null; foreach (var ex2 in ex1.Exchanges) { if (!ins.ContainsOrders(ex2)) { continue; } lock (ex2) { if (ex1.TradingState == TradingState.NoCrypt) { if (ex2.TradingState == TradingState.NoUsd || ex2.TradingState == TradingState.Ok) { _profitRatios[ex2.GetExchangeName()] = _balance.GetProfitRatio(ex1, ex2, ins, data); } } data.AskPrice1 = data.BidPrice2 = 0; } } if (_profitRatios.Count == 0) { return(false); } var min = _profitRatios.OrderBy(kvp => kvp.Value).First(); var max = _profitRatios.OrderBy(kvp => kvp.Value).Last(); _profitRatios.Clear(); return(true); }
public void HandlingOrder(Action <IExchange> createOrder, IExchange exchange, AutoResetEvent evt, Instrument ins, ExchangePricesEventArgs args) { var type = ins.GetOrderType(args); var ex = exchange.GetExchangeName(); if (SignAsRemoved(ex, type, args)) { Lock(exchange, () => { SaveOrder(ex, type); if (!args.IsOrderDeleted) { SaveOrder(ex, type, args.OrderId); createOrder(exchange); if (ins.ContainsOrders(exchange)) { evt.Set(); } } }); } }