public Wallet ComputeNewOrders(Wallet currentOrders, MarketInfo objMarket, ExchangeInfo objExchange, TradingHistory history) { //the newOrders Wallet variable will contain all ask/bid/cancel orders to issue var newOrders = new Wallet(); //start with reserved resource //Dim askReserve As Decimal = Math.Max(Me._AskReserveAmount, currentOrders.btcs * (Me._AskReserveRate / 100)) //Dim bidReserve As Decimal = Math.Max(Me._BidReserveValue, currentOrders.usds * (Me._BidReserveRate / 100)) decimal avBtcsForTrading = currentOrders.PrimaryBalance; //- askReserve decimal avUsdsForTrading = currentOrders.SecondaryBalance; //- bidReserve //Then We simplify the current orders by merging orders of the same price, issueing corresponding cancel/new orders newOrders.ConsolidateOrders(ref currentOrders, true); //Feed the new orders wallet with available resources, Reserve resources for current open orders newOrders.PrimaryBalance = Math.Max(avBtcsForTrading - currentOrders.GetTotalAsksPrimary(), 0); newOrders.SecondaryBalance = Math.Max(avUsdsForTrading - currentOrders.GetTotalBidsSecondary(), 0); var tContext = new TradingContext(currentOrders, newOrders, objMarket, objExchange, history.GetLastTrend(), this); this.ComputeNewOrders(ref tContext); tContext.NewOrders.FitOrders(objExchange); //we update the trading history with last data history.Update(currentOrders, objMarket, tContext.NewOrders); return(tContext.NewOrders); }
public Wallet ComputeNewOrders(Wallet currentOrders, MarketInfo objMarket, ExchangeInfo objExchange, TradingHistory history) { var newOrders = new Wallet(); var askReserve = Math.Max(this.AskReserveAmount, currentOrders.PrimaryBalance * AskReserveRate / 100m); var bidReserve = Math.Max(this.BidReserveValue, currentOrders.SecondaryBalance * BidReserveRate / 100m); decimal avBtcsForTrading = currentOrders.PrimaryBalance - askReserve; decimal avUsdsForTrading = currentOrders.SecondaryBalance - bidReserve; //todo: should we update the original wallet? newOrders.ConsolidateOrders(ref currentOrders, true); newOrders.PrimaryBalance = Math.Max(avBtcsForTrading - currentOrders.GetTotalAsksPrimary(), decimal.Zero); newOrders.SecondaryBalance = Math.Max(decimal.Subtract(avUsdsForTrading, currentOrders.GetTotalBidsSecondary()), decimal.Zero); var tContext = new TradingContext(currentOrders, newOrders, objMarket, objExchange, history.GetLastTrend(), this); this.ComputeNewOrders(ref tContext); if (this.NoAsks) { tContext.NewOrders.ClearAsks(); if (this.ClearAsks) { tContext.NewOrders.CancelExistingOrders(tContext.CurrentOrders.OrderedAsks.ToArray()); } } if (this.NoBids) { tContext.NewOrders.ClearBids(); if (this.ClearBids) { tContext.NewOrders.CancelExistingOrders(tContext.CurrentOrders.OrderedBids.ToArray()); } } tContext.NewOrders.FitOrders(objExchange); history.Update(currentOrders, objMarket, tContext.NewOrders); return(tContext.NewOrders); }