Esempio n. 1
0
        public MarketReport(BazaarBot bazaar)
        {
            _commodities = new List <string> {
                "R: " + bazaar.TotalRounds.ToString()
            };
            var rounds = 1;

            foreach (var commodity in bazaar.CommodityClasses)
            {
                _commodities.Add(commodity);
                _commodityPrices.Add(bazaar.GetPriceAverage(commodity, rounds).ToString("N2"));
                _commodityAsks.Add(bazaar.GetAskAverage(commodity, rounds).ToString());
                _commodityBids.Add(bazaar.GetBidAverage(commodity, rounds).ToString());
                _commodityTrades.Add(bazaar.GetTradeAverage(commodity, rounds).ToString());
                _commodityProduction.Add(BazaarBot.Production.ContainsKey(commodity) ? BazaarBot.Production[commodity].ToString() : string.Empty);
            }

            foreach (var agentKey in bazaar.AgentClasses.Keys)
            {
                _agents.Add(agentKey);
                _agentProfit.Add(bazaar.GetProfitAverage(agentKey, rounds).ToString("N2"));

                var agents = bazaar.Agents.Where(p => p.ClassId == agentKey);

                _agentCount.Add(agents.Count().ToString("N0"));
                _agentMoney.Add(BazaarBot.Average(agents.Select(p => p.Money)).ToString("N0"));


                var inventory = Enumerable.Repeat(0f, bazaar.CommodityClasses.Count).ToArray();
                foreach (var a in agents)
                {
                    for (int i = 0; i < bazaar.CommodityClasses.Count; i++)
                    {
                        inventory[i] += a.QueryInventory(bazaar.CommodityClasses[i]);
                    }
                }
                _inventory.AddRange(inventory.Select(p => (p > 0 ? p / agents.Count() : 0)));
            }
        }
Esempio n. 2
0
        public void update_price_model(BazaarBot bazaar, string act, string commodity, bool success, float unit_price_ = 0)
        {
            if (success)
            {
                //Add this to my list of observed trades
                var observed_trades = _observedTradingRange[commodity];
                observed_trades.Add(unit_price_);
            }

            var public_mean_price = bazaar.GetPriceAverage(commodity, 1);

            var belief = _priceBeliefs[commodity];
            var mean   = (belief.X + belief.Y) / 2;
            var wobble = 0.05;

            var delta_to_mean = mean - public_mean_price;

            if (success)
            {
                if (act == "buy" && delta_to_mean > SIGNIFICANT)
                {                                  //overpaid
                    belief.X -= delta_to_mean / 2; //SHIFT towards mean
                    belief.Y -= delta_to_mean / 2;
                }
                else if (act == "sell" && delta_to_mean < -SIGNIFICANT)
                {                                  //undersold
                    belief.X -= delta_to_mean / 2; //SHIFT towards mean
                    belief.Y -= delta_to_mean / 2;
                }

                belief.X += (float)wobble * mean;       //increase the belief's certainty
                belief.Y -= (float)wobble * mean;
            }
            else
            {
                belief.X -= delta_to_mean / 2;  //SHIFT towards the mean
                belief.Y -= delta_to_mean / 2;

                var special_case = false;
                var stocks       = QueryInventory(commodity);
                var ideal        = Inventory.Ideal(commodity);

                if (act == "buy" && stocks < LOW_INVENTORY * ideal)
                {
                    //very low on inventory AND can't buy
                    wobble      *= 2;                   //bid more liberally
                    special_case = true;
                }
                else if (act == "sell" && stocks > HIGH_INVENTORY * ideal)
                {
                    //very high on inventory AND can't sell
                    wobble      *= 2;                   //ask more liberally
                    special_case = true;
                }

                if (!special_case)
                {
                    //Don't know what else to do? Check supply vs. demand
                    var asks = bazaar.GetAskAverage(commodity, 1);
                    var bids = bazaar.GetBidAverage(commodity, 1);

                    //supply_vs_demand: 0=balance, 1=all supply, -1=all demand
                    var supply_vs_demand = (asks - bids) / (asks + bids);

                    //too much supply, or too much demand
                    if (supply_vs_demand > SIG_IMBALANCE || supply_vs_demand < -SIG_IMBALANCE)
                    {
                        //too much supply: lower price
                        //too much demand: raise price

                        var new_mean = public_mean_price * (1 - supply_vs_demand);
                        delta_to_mean = mean - new_mean;

                        belief.X -= delta_to_mean / 2;  //SHIFT towards anticipated new mean
                        belief.Y -= delta_to_mean / 2;
                    }
                }

                belief.X -= (float)wobble * mean;       //decrease the belief's certainty
                belief.Y += (float)wobble * mean;
            }

            if (belief.X < MIN_PRICE)
            {
                belief.X = MIN_PRICE;
            }
            if (belief.Y < MIN_PRICE)
            {
                belief.Y = MIN_PRICE;
            }
            if (belief.Y > MAX_PRICE)
            {
                belief.Y = MAX_PRICE;
            }
            if (belief.X > MAX_PRICE)
            {
                belief.X = MAX_PRICE;
            }
        }