Exemplo n.º 1
0
        private Execution ExecuteArbitrageParallel(Arbitrage arbitrage)
        {
            Execution execution = new Execution(arbitrage);

            Parallel.ForEach(execution.GetSequence(), sequence =>
            {
                Int32 offset        = sequence.Item1;
                TriangulationStep x = sequence.Item2;
                TriangulationStep y = sequence.Item3;

                if (!Config.TradingEnabled)
                {
                    m_ExchangeEngine.TestOrder(x.Position, x.Symbol, arbitrage.GetQuantity(offset));
                    return;
                }

                OrderResult result = m_ExchangeEngine.PlaceOrder(x.Position, x.Symbol, arbitrage.GetQuantity(offset));

                if (x.Position == Position.Buy)
                {
                    x.Out = result.OtherQuantity;
                    y.In  = result.ExecutedQuantity;
                }
                else
                {
                    x.Out = result.ExecutedQuantity;
                    y.In  = result.OtherQuantity;
                }

                execution.Fees += result.Fees;
            });

            return(execution);
        }
Exemplo n.º 2
0
        private Execution ExecuteArbitrageSequential(Arbitrage arbitrage)
        {
            Decimal?  recalculatedQuantity = null;
            Execution execution            = new Execution(arbitrage);

            foreach ((Int32 offset, TriangulationStep x, TriangulationStep y) in execution.GetSequence())
            {
                Decimal quantity = recalculatedQuantity ?? arbitrage.GetQuantity(offset);

                if (!Config.TradingEnabled)
                {
                    m_ExchangeEngine.TestOrder(x.Position, x.Symbol, quantity);
                    continue;
                }

                OrderResult result = m_ExchangeEngine.PlaceOrder(x.Position, x.Symbol, quantity);

                if (x.Position == Position.Buy)
                {
                    x.Out = result.OtherQuantity;
                    y.In  = result.ExecutedQuantity;

                    SortedOrderBook orderBook = m_ExchangeEngine.GetOrderBook(y.Symbol);
                    recalculatedQuantity = CalculateDustless(OrderBookConversion(false, y.In, y.QuoteAsset, y.BaseAsset, orderBook), y.DustDecimals);
                }
                else
                {
                    x.Out = result.ExecutedQuantity;
                    y.In  = result.OtherQuantity;

                    recalculatedQuantity = CalculateDustless(y.In, y.DustDecimals);
                }

                execution.Fees += result.Fees;
            }

            return(execution);
        }