public static bool ParseOpenPositions(cAlgo.API.Positions _positions, out Messaging.Protobuf.Positions positions, string openedPositionLabel = "") { try { int index = 0; positions = new Messaging.Protobuf.Positions(); foreach (cAlgo.API.Position p in _positions) { if (!ParseOpenPosition(p, out Messaging.Protobuf.Position position, Messaging.Protobuf.Position.Types.StateChange.None)) { continue; } //Update StateChage if this is a newly opened position if (position.Label == openedPositionLabel) { position.StateChange = Messaging.Protobuf.Position.Types.StateChange.Opened; } positions.Position[index] = position; index++; } positions.Count = index; } catch (Exception e) { Console.WriteLine("FAILED to parse Positions: " + e.ToString()); positions = null; return(false); } return(true); }
//Return the greater retrace of the percentage price or percent closed positions public void CalculateRetraceFactor(Messaging.Protobuf.Positions positions) { double retraceFactor = 0; double percentClosed = BotState.CalcPercentOfPositionsClosed(); if (percentClosed <= percentRetrace) { retraceFactor = percentRetrace; } else { retraceFactor = percentClosed; } RetraceFactor = (int)retraceFactor; }
protected override void OnMessageReceived(object sender, MessageReceivedEventArgs e) { if (!IsInitialised) { return; } DateTime niffleTimeStamp = DateTime.FromBinary(e.Message.Timestamp); RoutingKey routingKey = new RoutingKey(e.EventArgs.RoutingKey); string source = routingKey.GetSource(); string action = routingKey.GetAction(); string _event = routingKey.GetEvent(); //Service messages received will be notify if (e.Message.Type == Niffle.Types.Type.Service) { if (e.Message.Service != null) { if (e.Message.Service.Success) { ReportExecution(source, action, _event, Utils.FormatDateTimeWithSeparators(niffleTimeStamp)); } } } //Positions messages will be for Position Opened, Closed or Modified. if (e.Message.Type == Niffle.Types.Type.Positions) { if (e.Message.Positions != null) { Messaging.Protobuf.Positions positions = e.Message.Positions; for (int count = 0; count < positions.Count; count++) { if (routingKey.GetEventAsEnum() == Event.ONPOSITIONCLOSED) { if (positions.Position[count].StateChange == Messaging.Protobuf.Position.Types.StateChange.Closed) { ReportPositionClosed(positions.Position[count]); } } if (routingKey.GetEventAsEnum() == Event.ONPOSITIONOPENED) { if (positions.Position[count].StateChange == Messaging.Protobuf.Position.Types.StateChange.Opened) { ReportPositionOpened(positions.Position[count]); } } if (routingKey.GetEventAsEnum() == Event.ONPOSITIONMODIFIED) { if (positions.Position[count].StateChange == Messaging.Protobuf.Position.Types.StateChange.Modified) { ReportPositionModified(positions.Position[count], Utils.FormatDateTimeWithSeparators(niffleTimeStamp)); } } } } } //Orders messages will be for Orders Placed, Cancelled or Modified if (e.Message.Type == Niffle.Types.Type.Orders) { if (e.Message.Orders != null) { Messaging.Protobuf.Orders orders = e.Message.Orders; for (int count = 0; count < orders.Count; count++) { if (routingKey.GetEventAsEnum() == Event.ONORDERPLACED) { if (orders.Order[count].StateChange == Messaging.Protobuf.Order.Types.StateChange.Placed) { ReportOrderPlaced(orders.Order[count]); } } if (routingKey.GetEventAsEnum() == Event.ONORDERCANCELLED) { if (orders.Order[count].StateChange == Messaging.Protobuf.Order.Types.StateChange.Cancelled) { ReportOrderCancelled(orders.Order[count], Utils.FormatDateTimeWithSeparators(niffleTimeStamp)); } } if (routingKey.GetEventAsEnum() == Event.ONORDERMODIFIED) { if (orders.Order[count].StateChange == Messaging.Protobuf.Order.Types.StateChange.Modified) { ReportOrderModified(orders.Order[count], Utils.FormatDateTimeWithSeparators(niffleTimeStamp)); } } } } } //Error messages if (e.Message.Type == Niffle.Types.Type.Orders) { if (e.Message.Error != null) { ReportError(source, e.Message.Error, Utils.FormatDateTimeWithSeparators(niffleTimeStamp)); } } }