/// <summary>
 /// Simulates customer accepting offerd price offer.
 /// </summary>
 /// <param name="dependencyFactory"></param>
 /// <param name="liquidityEngine">Engine responsible for executing money and crypto transfers.</param>
 /// <param name="priceRequestEvent">Simlated price request event offer from which the customer accepts.</param>
 /// <param name="acceptAtTime">Date and time the event takes place.</param>
 public OfferAcceptedEvent(SimulationDependencyFactory dependencyFactory, LiquidityEngine.LiquidityEngine liquidityEngine, NewPriceRequestEvent priceRequestEvent, DateTime acceptAtTime)
 {
     _priceRequestEvent = priceRequestEvent;
     _dependencyFactory = dependencyFactory;
     _liquidityEngine   = liquidityEngine;
     SimTime            = acceptAtTime;
 }
        /// <summary>
        /// Simulates a given scenario and calculates profit / loss that would be made if scenario happened on each second in history of captured market order books.
        /// Profit/losses are output to a file given in scenario description.
        /// </summary>
        /// <param name="scenario">Scenario to simulate.</param>
        /// <param name="historyLoader">Loader to be used to access history of market order books.</param>
        public ProfitSimulator(SimulationScenario scenario, BitstampHistoryLoader historyLoader)
        {
            _historyEnumerator = new HistoryEnumerator(historyLoader);
            var firstEntry = _historyEnumerator.PeekNext();

            if (firstEntry == null)
            {
                return;
            }

            _engine = new SimulationEngine(firstEntry.AcqTime);
            _engine.AfterEventSimulation += LoadOrderBookHistoryEventsIntoEngine;


            _dependencyFactory = new SimulationDependencyFactory(_engine);

            _scenario = scenario;
            _dependencyFactory.HedgingEngine.WhenStrategy.Delay         = _scenario.HedgingDelay * 1000;
            _dependencyFactory.PricingEngine.PricingStrategy.SellSpread = _scenario.SellSpread / 100;
            _dependencyFactory.PricingEngine.PricingStrategy.BuySpread  = _scenario.BuySpread / 100;
            _dependencyFactory.SolarisBank.InfiniteBalance = true;
            _dependencyFactory.SolarisBank.TransferDelay   = 10;

            _resultWriter = new CsvProfitSimulationWriter(_scenario.OutputFilename);
            _resultWriter.Initialize();

            _isSimulationDone = false;

            _liquidityEngine = new SimulationLiquidityEngineMoq(_dependencyFactory);
        }
Example #3
0
        /// <summary>
        /// Create a list of simulation events which simulate customer's behaviour.
        /// </summary>
        /// <param name="dependencyFactory">Dependency factory to be used during events creation.</param>
        /// <param name="liquidityEngine">Engine responsible for executing money and crypto transfers.</param>
        /// <param name="simStart">At what time does the current simulated time period start.</param>
        /// <returns>List of simulation events which simulate customer's behaviour.</returns>
        public List <ISimEvent> CreateEvents(SimulationDependencyFactory dependencyFactory, LiquidityEngine.LiquidityEngine liquidityEngine, DateTime simStart)
        {
            var events = new List <ISimEvent>();

            if (IsMarketTrader)
            {
                events.Add(new MarketTradeEvent(dependencyFactory, simStart.AddSeconds(RequestDelay), Amount, Value, BuySell));
                return(events);
            }

            var priceRequest = new NewPriceRequestEvent(dependencyFactory, simStart.AddSeconds(RequestDelay), Amount, Value, BuySell);

            events.Add(priceRequest);

            var acceptRejectDelay = simStart.AddSeconds(RequestDelay + AcceptRejectDelay);

            if (AcceptsOffer)
            {
                events.Add(new OfferAcceptedEvent(dependencyFactory, liquidityEngine, priceRequest, acceptRejectDelay));
            }
            else
            {
                events.Add(new OfferRejectedEvent(dependencyFactory, priceRequest, acceptRejectDelay));
            }

            return(events);
        }