Exemplo n.º 1
0
        private void BackgroundProcess(bool testMode)
        {
            const string autoProcessSellordersQuery = @"
SELECT 
sellorders.marketitemid so_id, sellorders.marketeid so_market,sellorders.price so_price,sellorders.quantity so_qty,
buyorders.marketitemid bo_id, buyorders.quantity bo_qty, buyorders.price bo_price, buyorders.submitted bo_submit

FROM marketitems sellorders
JOIN marketitems buyorders ON sellorders.itemdefinition=buyorders.itemdefinition AND sellorders.marketeid=buyorders.marketeid

WHERE
sellorders.isvendoritem=0 AND
sellorders.isSell=1 
AND
buyorders.isvendoritem=0 AND
buyorders.isSell=0
AND
sellorders.submittereid != buyorders.submittereid
AND
buyorders.price >= sellorders.price
AND
COALESCE(sellorders.formembersof,0) = COALESCE(buyorders.formembersof,0)

ORDER BY bo_price DESC, so_price ASC, bo_submit ASC

";

            //this one buys from the same character
            const string autoProcessSellordersQueryTest = @"
SELECT 
sellorders.marketitemid so_id, sellorders.marketeid so_market,sellorders.price so_price,sellorders.quantity so_qty,
buyorders.marketitemid bo_id, buyorders.quantity bo_qty, buyorders.price bo_price, buyorders.submitted bo_submit

FROM marketitems sellorders
JOIN marketitems buyorders ON sellorders.itemdefinition=buyorders.itemdefinition AND sellorders.marketeid=buyorders.marketeid

WHERE
sellorders.isvendoritem=0 AND
sellorders.isSell=1 
AND
buyorders.isvendoritem=0 AND
buyorders.isSell=0
AND
buyorders.price >= sellorders.price
AND
COALESCE(sellorders.formembersof,0) = COALESCE(buyorders.formembersof,0)

ORDER BY bo_price DESC, so_price ASC, bo_submit ASC

";


            try
            {
                var q = testMode ? autoProcessSellordersQueryTest : autoProcessSellordersQuery;

                var records = Db.Query().CommandText(q).Execute();

                Logger.Info("found " + records.Count + " market orders to process for price matching.");

                var count = 0;

                foreach (var record in records)
                {
                    var sellOrderId = record.GetValue <int>("so_id");
                    var buyOrderId  = record.GetValue <int>("bo_id");

                    var sellOrder = _marketOrderRepository.Get(sellOrderId);
                    var buyOrder  = _marketOrderRepository.Get(buyOrderId);

                    if (sellOrder == null || buyOrder == null)
                    {
                        continue;
                    }

                    using (var scope = Db.CreateTransaction())
                    {
                        try
                        {
                            Market.AutoProcessSellorders(sellOrder, buyOrder);
                            scope.Complete();
                            count++;
                        }
                        catch (Exception ex)
                        {
                            Logger.Error("error in AutoProcessSellorders");
                            Logger.Exception(ex);
                        }
                    }
                }

                Logger.Info(count + " market orders were affected in price matching.");
            }
            catch (Exception ex)
            {
                Logger.Info("error occured in LoadMatchingOrders");
                Logger.Exception(ex);
            }
        }