public void RunAsync(SyncTickers syncTickers, StrategyBase strategy, ISimulationSettings settings) { if (syncTickers == null) throw new ArgumentNullException("syncTickers"); if (strategy == null) throw new ArgumentNullException("strategy"); if (settings == null) throw new ArgumentNullException("settings"); if (IsBusy) throw new InvalidOperationException("Already running."); var asyncSimulationAlgorithm = new SimulationContextAsyncDecorator(SimulationContextFactory.CreateContext()); cancelSimulation = () => asyncSimulationAlgorithm.Cancel(); simulationTask = Task.Factory.StartNew(() => { using (asyncSimulationAlgorithm) { var runResult = base.SimulationAlgorithmFlow(asyncSimulationAlgorithm, syncTickers, strategy, settings); lock (cancelRaceConditionSync) { cancelSimulation = delegate { }; } EndInfo = new SimulationEndEventArgs { Error = runResult.Error, Result = runResult.Value, EndReason = runResult.Error != null ? SimulationEndReason.Error : runResult.Value != null ? SimulationEndReason.Completion : SimulationEndReason.Cancellation }; SimulationEnded(this, EndInfo); } }); //while (simulationTask.Status < TaskStatus.Running) ; }
bool ISimulationContext.Initialize(SyncTickers syncTickers, StrategyBase strategy, ISimulationSettings settings) { this.strategy = strategy; this.settings = settings; this.syncTickers = syncTickers; this.account = new Account(settings.Get<InitialEquitySetting>().Value); this.strategy.QuoteContext = this.quoteContext = new QuoteContext(syncTickers); this.transactionProcessor = new TransactionProcessor(quoteContext, account, settings); this.strategy.WalletContext = this.walletContext = new WalletContext(quoteContext, account, transactionProcessor); this.resultQuotes = new List<SimulationResultQuote>(); return strategy.Initialize(); }