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))); } }
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; } }