/// <summary> /// Instantiates a new instance. /// </summary> /// <param name="bars">The list of Bar instances to use during the backtest.</param> public StrategyBacktester(IEnumerable <Bar> bars) { var orderCreator = new OrderCreator(); orderCreator.OrderSent += (order) => OrderSent.SafeTrigger(order); var manager = new StrategyManager(orderCreator); StrategyInfo = manager.StrategyInfo; playableBars = new PlayableBars(bars); runner = new StrategyRunner <T>( playableBars.ToSingleDataStream(), orderCreator: orderCreator, strategyInfo: StrategyInfo); Strategy = runner.Strategy; }
/// <summary> /// Triggers the OrderSent event. /// </summary> /// <param name="orderInfo">The information about the order.</param> protected virtual void TriggerOrderSent(OrderInfo orderInfo) { OrderSent.SafeTrigger(orderInfo); }
protected virtual async Task OnOrderSent(IOrderSentEventArgs args) { if (OrderSent != null) await OrderSent.Invoke(this, args); }
public void OnMessage(string message) { Debug.WriteLine($"{WebSocketConnection}> {message}"); if (WebSerializer.TryParseRequest(message, out WebSimpleMessageType simpleMessage)) { switch (simpleMessage) { case WebSimpleMessageType.Failure: case WebSimpleMessageType.Success: MessageQueue.Enqueue(message); NewMessageEvent.Set(); break; default: // the server will not ask the client for data throw new NotImplementedException(); } } else { WebMessageDTO <object> msgDto = WebSerializer.DeserializeWebMessage(message); switch (msgDto.MessageType) { case WebMessageType.ProvideAllClients: case WebMessageType.ProvideAllProducts: case WebMessageType.ProvideAllOrders: case WebMessageType.ProvideClient: case WebMessageType.ProvideProduct: case WebMessageType.ProvideOrder: { MessageQueue.Enqueue(message); NewMessageEvent.Set(); break; } case WebMessageType.OrderSent: { OrderSent orderSent = new OrderSent((msgDto.Data as OrderDTO)?.ToIOrder()); foreach (IObserver <OrderSent> observer in OrderSentObservers) { observer.OnNext(orderSent); } break; } case WebMessageType.AddClient: { DataChanged <IClient> change = new DataChanged <IClient>(DataChangedAction.Add, new List <IClient> { (msgDto.Data as ClientDTO)?.ToIClient() }); foreach (IObserver <DataChanged <IClient> > observer in ClientObservers) { observer.OnNext(change); } break; } case WebMessageType.UpdateClient: { DataChanged <IClient> change = new DataChanged <IClient>(DataChangedAction.Update, new List <IClient> { (msgDto.Data as ClientDTO)?.ToIClient() }); foreach (IObserver <DataChanged <IClient> > observer in ClientObservers) { observer.OnNext(change); } break; } case WebMessageType.RemoveClient: { DataChanged <IClient> change = new DataChanged <IClient>(DataChangedAction.Remove, new List <IClient> { (msgDto.Data as ClientDTO)?.ToIClient() }); foreach (IObserver <DataChanged <IClient> > observer in ClientObservers) { observer.OnNext(change); } break; } case WebMessageType.AddProduct: { DataChanged <IProduct> change = new DataChanged <IProduct>(DataChangedAction.Add, new List <IProduct> { (msgDto.Data as ProductDTO)?.ToIProduct() }); foreach (IObserver <DataChanged <IProduct> > observer in ProductObservers) { observer.OnNext(change); } break; } case WebMessageType.UpdateProduct: { DataChanged <IProduct> change = new DataChanged <IProduct>(DataChangedAction.Update, new List <IProduct> { (msgDto.Data as ProductDTO)?.ToIProduct() }); foreach (IObserver <DataChanged <IProduct> > observer in ProductObservers) { observer.OnNext(change); } break; } case WebMessageType.RemoveProduct: { DataChanged <IProduct> change = new DataChanged <IProduct>(DataChangedAction.Remove, new List <IProduct> { (msgDto.Data as ProductDTO)?.ToIProduct() }); foreach (IObserver <DataChanged <IProduct> > observer in ProductObservers) { observer.OnNext(change); } break; } case WebMessageType.AddOrder: { DataChanged <IOrder> change = new DataChanged <IOrder>(DataChangedAction.Add, new List <IOrder> { (msgDto.Data as OrderDTO)?.ToIOrder() }); foreach (IObserver <DataChanged <IOrder> > observer in OrderObservers) { observer.OnNext(change); } break; } case WebMessageType.UpdateOrder: { DataChanged <IOrder> change = new DataChanged <IOrder>(DataChangedAction.Update, new List <IOrder> { (msgDto.Data as OrderDTO)?.ToIOrder() }); foreach (IObserver <DataChanged <IOrder> > observer in OrderObservers) { observer.OnNext(change); } break; } case WebMessageType.RemoveOrder: { DataChanged <IOrder> change = new DataChanged <IOrder>(DataChangedAction.Remove, new List <IOrder> { (msgDto.Data as OrderDTO)?.ToIOrder() }); foreach (IObserver <DataChanged <IOrder> > observer in OrderObservers) { observer.OnNext(change); } break; } case WebMessageType.Error: { string errorMsg = msgDto.Data as string; Debug.WriteLine($"The server has encountered an exception! {errorMsg}"); break; } } } }
/// <summary> /// Called when an order has been sent. Triggers the OrderSent event. /// </summary> /// <param name="order">The order information that was sent.</param> private void OnOrderSent(OrderInfo order) { OrderSent.SafeTrigger(order); }