コード例 #1
0
        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 - должны быть отсортированы по убыванию времени входа");
        }
コード例 #2
0
 public override RequestStatus GetOrdersByFilter(int accountId, bool getClosedOrders, OrderFilterAndSortOrder filter, out List<MarketOrder> orders)
 {
     return TradeSharpAccount.Instance.proxy.GetOrdersByFilter(accountId, getClosedOrders, filter, out orders);
 }
コード例 #3
0
ファイル: RobotContext.cs プロジェクト: johnmensen/TradeSharp
 public abstract RequestStatus GetOrdersByFilter(int accountId, bool getClosedOrders, OrderFilterAndSortOrder filter, out List<MarketOrder> orders);
コード例 #4
0
        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 } };
        }
コード例 #5
0
        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>();
        }
コード例 #6
0
        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;
                }
            }
        }