public void TestFilter() { var orders = MakeOrders(); var filter = new OrderFilterAndSortOrder { filterExpertComment = "FX", filterTicker = "USDCAD", filterMagic = 5, sortAscending = false, sortByTimeEnter = true, takeCount = 2 }; var filtered = filter.ApplyFilter(orders.AsQueryable()).ToList(); Assert.AreEqual(2, filtered.Count, "OrderFilterAndSortOrder - должен вернуть ровно 2 записи"); Assert.AreEqual(2, filtered[0].ID, "OrderFilterAndSortOrder - должны быть отсортированы по убыванию времени входа"); }
public override RequestStatus GetOrdersByFilter(int accountId, bool getClosedOrders, OrderFilterAndSortOrder filter, out List<MarketOrder> orders) { return TradeSharpAccount.Instance.proxy.GetOrdersByFilter(accountId, getClosedOrders, filter, out orders); }
public abstract RequestStatus GetOrdersByFilter(int accountId, bool getClosedOrders, OrderFilterAndSortOrder filter, out List<MarketOrder> orders);
public override Dictionary<string, DateTime> GetRequiredSymbolStartupQuotes(DateTime startTrade) { if (string.IsNullOrEmpty(ticker)) return null; // определить, когда была открыта последняя сделка робота // нужно знать все свечи на интервале от этого входа до момента старта var filter = new OrderFilterAndSortOrder { filterExpertComment = RobotNamePreffix, filterTicker = ticker, filterMagic = Magic, sortAscending = false, sortByTimeEnter = true, takeCount = 1 }; List<MarketOrder> ordersClosed; robotContext.GetOrdersByFilter(robotContext.AccountInfo.ID, true, filter, out ordersClosed); List<MarketOrder> orders; robotContext.GetOrdersByFilter(robotContext.AccountInfo.ID, false, filter, out orders); var ordersTotal = (ordersClosed ?? new List<MarketOrder>()).Union(orders ?? new List<MarketOrder>()); var lastOrder = ordersTotal.OrderByDescending(o => o.TimeEnter).FirstOrDefault(); var requestStart = startTrade; if (lastOrder != null && lastOrder.TimeEnter < requestStart) requestStart = lastOrder.TimeEnter; // дать запас времени для точного формирования свечи requestStart = requestStart.AddMinutes(-1024); return new Dictionary<string, DateTime> { { ticker, requestStart } }; }
private List<MarketOrder> GetLastClosedOrders() { var filter = new OrderFilterAndSortOrder { filterExpertComment = RobotNamePreffix, filterMagic = Magic, takeCount = MaxDealsInSeries + 1, sortAscending = false, sortByTimeEnter = true, filterTicker = ticker }; List<MarketOrder> ordersClosed; robotContext.GetOrdersByFilter(robotContext.AccountInfo.ID, true, filter, out ordersClosed); return ordersClosed ?? new List<MarketOrder>(); }
public RequestStatus GetOrdersByFilter( int accountId, bool getClosedOrders, OrderFilterAndSortOrder filter, out List<MarketOrder> orders) { using (var ctx = DatabaseContext.Instance.Make()) { try { if (getClosedOrders) { var positions = from pos in ctx.POSITION_CLOSED where pos.AccountID == accountId && (filter.filterMagic == null || filter.filterMagic.Value == pos.Magic) && (filter.filterSide == null || filter.filterSide.Value == pos.Side) && (string.IsNullOrEmpty(filter.filterComment) || pos.Comment.Contains(filter.filterComment)) && (string.IsNullOrEmpty(filter.filterExpertComment) || pos.ExpertComment.Contains(filter.filterExpertComment)) && (string.IsNullOrEmpty(filter.filterTicker) || pos.Symbol.Contains(filter.filterTicker)) && (filter.filterTimeEnterStartsWith == null || pos.TimeEnter >= filter.filterTimeEnterStartsWith.Value) && (filter.filterTimeEnterEndsWith == null || pos.TimeEnter <= filter.filterTimeEnterEndsWith.Value) && (filter.filterTimeExitStartsWith == null || pos.TimeExit >= filter.filterTimeExitStartsWith) && (filter.filterTimeExitEndsWith == null || pos.TimeExit <= filter.filterTimeExitEndsWith) select pos; positions = (filter.sortAscending ? positions.OrderBy(p => filter.sortByTimeEnter ? p.TimeEnter : p.TimeExit) : positions.OrderByDescending(p => filter.sortByTimeEnter ? p.TimeEnter : p.TimeExit)) .Take(filter.takeCount); orders = positions.ToList().Select(LinqToEntity.DecorateOrder).ToList(); } else { var positions = from pos in ctx.POSITION where pos.AccountID == accountId && (filter.filterMagic == null || filter.filterMagic.Value == pos.Magic) && (filter.filterSide == null || filter.filterSide.Value == pos.Side) && (string.IsNullOrEmpty(filter.filterComment) || pos.Comment.Contains(filter.filterComment)) && (string.IsNullOrEmpty(filter.filterExpertComment) || pos.Comment.Contains(filter.filterExpertComment)) && (string.IsNullOrEmpty(filter.filterTicker) || pos.Comment.Contains(filter.filterTicker)) && (filter.filterTimeEnterStartsWith == null || pos.TimeEnter >= filter.filterTimeEnterStartsWith.Value) && (filter.filterTimeEnterEndsWith == null || pos.TimeEnter <= filter.filterTimeEnterEndsWith.Value) select pos; positions = (filter.sortAscending ? positions.OrderBy(p => p.TimeEnter) : positions.OrderByDescending(p => p.TimeEnter)) .Take(filter.takeCount); orders = positions.ToList().Select(LinqToEntity.DecorateOrder).ToList(); } return RequestStatus.OK; } catch (Exception ex) { orders = null; Logger.ErrorFormat("Ошибка в GetOrdersByFilter({0}): {1}", accountId, ex); return RequestStatus.ServerError; } } }