public virtual void Initialize(DataSource dataSource, StreamingProvider streamingProvider, OrderProcessor orderProcessor, IStatusReporter connectionStatus) {
			this.DataSource = dataSource;
			this.StreamingProvider = streamingProvider;
			this.OrderProcessor = orderProcessor;
			this.StatusReporter = connectionStatus;
			this.AccountAutoPropagate.Initialize(this);
		}
		public OrderPostProcessorStateChangedTrigger(OrderProcessor orderProcessor) {
			this.orderProcessor = orderProcessor;
			this.hooks = new List<OrderPostProcessorStateHook>();
			this.hooksLock = new Object();
		}
		public OrderProcessorDataSnapshot(OrderProcessor orderProcessor) : this() {
			this.OrderProcessor = orderProcessor;
		}
		public OrderProcessorEventDistributor(OrderProcessor orderProcessor) : base() {
			this.orderProcessor = orderProcessor;
		}
//		[Obsolete("looks illogical, move IStatusReporter to Initialize() and use Assembler.InstanceInitialized instead of Assembler.Constructed")]
//		protected Assembler(IStatusReporter mainForm) : this() {
//			this.StatusReporter = mainForm;
//			Assembler.instance = this;
//		}
		public Assembler() {
			this.RepositoryCustomSymbolInfo = new RepositoryCustomSymbolInfo();
			this.MarketInfoRepository = new RepositoryCustomMarketInfo();
			this.RepositoryJsonDataSource = new RepositoryJsonDataSource();
			this.RepositoryDllJsonStrategy = new RepositoryDllJsonStrategy();

			this.RepositoryDllStaticProvider = new RepositoryDllStaticProvider();
			this.RepositoryDllStreamingProvider = new RepositoryDllStreamingProvider();
			this.RepositoryDllBrokerProvider = new RepositoryDllBrokerProvider();
			this.RepositoryDllReporters = new RepositoryDllReporters();
			
			this.WorkspacesRepository = new RepositoryFoldersNoJson();

			//this.ChartRendererConfigured = new ChartRenderer();
			this.OrderProcessor = new OrderProcessor();
			this.AlertsForChart = new DictionaryManyToOne<ChartShadow, Alert>();
			
			this.AssemblerDataSnapshot = new AssemblerDataSnapshot();
			this.AssemblerDataSnapshotSerializer = new Serializer<AssemblerDataSnapshot>();
		}
		public void Initialize(string dataSourcesAbspath, OrderProcessor orderProcessor, IStatusReporter statusReporter) {
			//if (this.HasBarDataStore) {
			//    this.BarsFile = new BarsFile(FolderForBarDataStore);
			//}
			this.DataSourcesAbspath = dataSourcesAbspath;
			this.DataSourceAbspath = Path.Combine(this.DataSourcesAbspath, this.Name);
			this.BarsRepository = new RepositoryBarsSameScaleInterval(this.DataSourceAbspath, this.ScaleInterval, true);
			
			//this.BarsFolderPerst = new BarsFolder(this.FolderForBarDataStore, this.ScaleInterval, true, "dts");

			// works only for deserialized providers; for a newDataSource they are NULLs to be assigned in DataSourceEditor 
			if (this.StaticProvider != null) {
				this.StaticProvider.Initialize(this, dataSourcesAbspath);
			}
			if (this.StreamingProvider != null) {
				this.StreamingProvider.Initialize(this, statusReporter);
				if (this.BrokerProvider != null) {
					this.BrokerProvider.Initialize(this, this.StreamingProvider, orderProcessor, statusReporter);
				}
			}
		}
		public OrderPostProcessorRejected(OrderProcessor orderProcessor) {
			this.OrderProcessor = orderProcessor;
		}
		public OrderPostProcessorEmergency(OrderProcessor orderProcessor, OrderPostProcessorSequencerCloseThenOpen OPPSequencer) {
			this.emergencyLocks = new List<OrderPostProcessorEmergencyLock>();
			this.interruptedEmergencyLockReasons = new List<Order>();
			this.orderProcessor = orderProcessor;
			this.OPPsequencer = OPPSequencer;
		}
		public OrderPostProcessorReplacerTidalThenCrossMarket(OrderProcessor orderProcessor) {
			this.ordersCloseOpen = new Dictionary<List<Order>, List<Order>>();
			this.orderProcessor = orderProcessor;
		}
		public OrderPostProcessorSequencerCloseThenOpen(OrderProcessor orderProcessor) {
			this.dictionaryLock = new object();
			this.sequencerLockCloseOpen = new Dictionary<List<Order>, List<Order>>();
			this.orderProcessor = orderProcessor;
		}