Exemplo n.º 1
0
        public override object Clone()
        {
            var p = new BacktestingProject()
            {
                Name              = Name,
                Memo              = Memo,
                IsUnlimited       = IsUnlimited,
                AnalyseGrade      = AnalyseGrade,
                AnalyseStartTime  = AnalyseStartTime,
                CurrentDataSource = CurrentDataSource.Clone() as IDataSource,
                CurrentTradeGate  = CurrentTradeGate,
                Fine              = Fine,
                Grade             = Grade,
                ProjectStartTime  = ProjectStartTime,
                RiskPolicy        = RiskPolicy.Clone() as IRiskControl,
                Status            = Status,
                TargetPortfolio   = TargetPortfolio.Clone() as IPortfolio,
                TestStrategy      = TestStrategy.Clone() as IStrategy,
                TestCurrentTime   = TestCurrentTime,
                TestEndTime       = TestEndTime,
                TestStartTime     = TestStartTime,
                TestStepDelayMS   = TestStepDelayMS,
            };

            ConditionList.ForEach(v => p.ConditionList.Add(v.Clone() as ICondition));
            InstrumentList.ForEach(v => p.InstrumentList.Add(v.Clone() as IInstrument));

            return(p);
        }
Exemplo n.º 2
0
 public override void SaveOriginalStatus()
 {
     CurrentDataSource.SaveOriginalStatus();
     ConditionList.ForEach(v => v.SaveOriginalStatus());
     TargetPortfolio.SaveOriginalStatus();
     TestStrategy.SaveOriginalStatus();
     CurrentTradeGate.SaveOriginalStatus();
     RiskPolicy.SaveOriginalStatus();
 }
Exemplo n.º 3
0
 public override void FinishWork()
 {
     TestCurrentTime = TestEndTime;
     TargetPortfolio.FinishWork();
     ConditionList.ForEach(v => v.FinishWork());
     //SensorList.ForEach(v => v.FinishWork());
     CurrentTradeGate.FinishWork();
     CurrentDataSource.FinishWork();
     TestStrategy.FinishWork();
     RiskPolicy.FinishWork();
 }
Exemplo n.º 4
0
 public override void LoadOriginalStatus()
 {
     if (Status != ProjectStatus.Stopped)
     {
         Stop();
     }
     CurrentDataSource.LoadOriginalStatus();
     ConditionList.ForEach(v => v.LoadOriginalStatus());
     TargetPortfolio.LoadOriginalStatus();
     TestStrategy.LoadOriginalStatus();
     CurrentTradeGate.LoadOriginalStatus();
     RiskPolicy.LoadOriginalStatus();
 }
Exemplo n.º 5
0
        public IActionResult GetTargetPortfolio()
        {
            string          userId    = m_userManager.GetUserId(HttpContext.User);
            TargetPortfolio portfolio = m_allocationsManager.GetTargetPortfolio(userId);

            if (portfolio == null)
            {
                return(NotFound());
            }
            IDictionary <string, decimal> allocations = portfolio.Allocations.ToDictionary(allocation => allocation.Symbol, allocation => allocation.Proportion);

            return(Ok(new AllocationsViewModel(allocations)));
        }
Exemplo n.º 6
0
        public bool SetTargetPortfolio(string userId, IDictionary <string, decimal> allocations)
        {
            bool success = true;

            allocations = new Dictionary <string, decimal>(allocations);
            TargetPortfolio portfolio = m_context.TargetPortfolios.Find(userId);

            using (IDbContextTransaction transaction = m_context.Database.BeginTransaction())
            {
                try
                {
                    if (portfolio == null)
                    {
                        portfolio = new TargetPortfolio(userId);
                        m_context.TargetPortfolios.Add(portfolio);
                        m_context.SaveChanges();
                    }
                    IList <TargetAllocation> currentAllocations = portfolio.Allocations.ToList();
                    foreach (TargetAllocation allocation in currentAllocations)
                    {
                        string symbol = allocation.Symbol;
                        if (allocations.ContainsKey(symbol))
                        {
                            allocation.Proportion = allocations[symbol];
                            allocations.Remove(symbol);
                        }
                        else
                        {
                            m_context.TargetAllocations.Remove(allocation);
                        }
                        m_context.SaveChanges();
                    }
                    foreach (KeyValuePair <string, decimal> allocation in allocations)
                    {
                        var targetAllocation = new TargetAllocation(userId, allocation.Key, allocation.Value);
                        m_context.TargetAllocations.Add(targetAllocation);
                        m_context.SaveChanges();
                    }
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    m_logger.LogError($"Failed to set target allocation: {ex}");
                    transaction.Rollback();
                    success = false;
                }
            }
            return(success);
        }
Exemplo n.º 7
0
        public override void PrepareWork()
        {
            TargetPortfolio.PrepareWork();
            MarketDataList.Clear();
            CurrentDataSource.DataList.Clear();
            CurrentValueList.Clear();
            StandardValueList.Clear();
            OrderList.Clear();

            DateTime st = TestStartTime;

            if (TestStartTime > AnalyseStartTime)
            {
                st = AnalyseStartTime;
            }
            CurrentDataSource.CacheStartTime = st;
            CurrentDataSource.CacheEndTime   = TestEndTime;

            TestCurrentTime = TestStartTime;
            analyseTime     = MarketData.GetNextTime(TestCurrentTime, AnalyseGrade);

            _MaxLost = new Money()
            {
                FxCode = Pnl.FxCode, Number = 0
            };
            if (UseFirstMarketDataInit)
            {
                var fdl = new List <IMarketData>();
                InstrumentList.ForEach(v =>
                {
                    var d = CurrentDataSource.GetFirstData(v, TestStartTime, TestEndTime, Grade);
                    if (d != null)
                    {
                        fdl.Add(d);
                    }
                });
                TargetPortfolio.ProcessMarketData(fdl);
                TargetPortfolio.PositionList.ForEach(v =>
                {
                    var d = fdl.FirstOrDefault(m => m.InstrumentTicker == v.InstrumentTicker);
                    if (d != null)
                    {
                        v.Cost = d.Close;
                    }
                });
            }
            if (IsUnlimited)
            {
                TargetPortfolio.IsUnlimited = true;
            }
            standardPortfolio = TargetPortfolio.Clone() as IPortfolio;
            testStartValue    = TargetPortfolio.CurrentValue;
            CurrentDataSource.PrepareWork();
            CurrentTradeGate.PrepareWork();
            foreach (var condition in ConditionList)
            {
                condition.PrepareWork();
                condition.GetInstrumentList = () => { return(InstrumentList); };
                condition.AnalyseDataSource = CurrentDataSource;
            }

            TestStrategy.CurrentPortfolio = TargetPortfolio;
            TestStrategy.PrepareWork();
            RiskPolicy.PrepareWork();
        }
Exemplo n.º 8
0
        void TestStep(DateTime start, DateTime end)
        {
            TestStrategy.CurrentTime = end;
            AddInfo("test step, start:" + start.ToString() + ",end:" + end.ToString());
            var dl = CurrentDataSource.GetDataList(InstrumentList, start, end, Grade);

            AddInfo("got market data ,count is:" + dl.Count.ToString());
            if (dl == null || dl.Count == 0)
            {
                return;
            }
            TestStrategy.CurrentTime = dl.Max(d => d.Time);
            dl.ForEach(v =>
            {
                var inst = InstrumentList.FirstOrDefault(i => i.Ticker == v.InstrumentTicker);
                if (inst != null)
                {
                    AddInfo("update " + inst.Name + " price, value is:" + v.Close.ToString() + "(" + v.Time.ToString() + ")");
                    inst.CurrentPrice = v.Close;
                }
            });
            MarketDataList.AddRange(dl);
            AddInfo("portfolio process market data!");
            TargetPortfolio.ProcessMarketData(dl);
            AddInfo("standard portfolio process market data!");
            standardPortfolio.ProcessMarketData(dl);
            AddInfo("strategy process market data!");
            TestStrategy.ProcessMarketData(dl);

            if (analyseTime <= end)
            {
                AddInfo("prepare analyse, analyse time is:" + analyseTime.ToString());
                AnalyseStep();
                analyseTime = MarketData.GetNextTime(end, AnalyseGrade);
                var cl = new List <ISignal>();
                foreach (var condition in ConditionList)
                {
                    var rl = condition.GetResult();
                    if (rl != null && rl.Count > 0)
                    {
                        cl.AddRange(rl);
                    }
                }
                if (cl.Count > 0)
                {
                    AddInfo("got signal, count is " + cl.Count.ToString());
                    TestStrategy.ProcessSignal(cl);
                }
            }
            AddInfo("strategy process portfolio");
            TestStrategy.ProcessPortfolio();
            var ol = TestStrategy.GetOrderList();

            if (ol.Count > 0)
            {
                AddInfo("strategy generate order, count is :" + ol.Count.ToString());
                List <IOrder> col = new List <IOrder>();
                foreach (var o in ol)
                {
                    if (o != null && RiskPolicy.PredictOrder(o, TargetPortfolio))
                    {
                        col.Add(o);
                    }
                }
                OrderList.AddRange(col);
                AddInfo("trade gate process order");
                CurrentTradeGate.ProcessorOrder(col);
                AddInfo("portfolio info before process order is" + GetPortfolioMemo(TargetPortfolio));
                TargetPortfolio.ProcessOrderList(col);
                AddInfo("portfolio info after process order is" + GetPortfolioMemo(TargetPortfolio));
            }

            if (!IsUnlimited)//adjust risk
            {
                AddInfo("adjust risk");
                ol = RiskPolicy.AdjustRisk(TargetPortfolio);
                if (ol.Count > 0)
                {
                    AddInfo("risk order generate, count is:" + ol.Count.ToString());
                    OrderList.AddRange(ol);
                    List <IOrder> col = ol.Where(v => v != null).ToList();
                    CurrentTradeGate.ProcessorOrder(col);
                    TargetPortfolio.ProcessOrderList(col);
                }
            }
            CurrentValueList.Add(new TimeValueObject()
            {
                Time = dl.Max(v => v.Time), Value = CurrentValue, Memo = GetPortfolioMemo(TargetPortfolio)
            });
            StandardValueList.Add(new TimeValueObject()
            {
                Time = dl.Max(v => v.Time), Value = StandardValue, Memo = GetPortfolioMemo(standardPortfolio)
            });
            if (_MaxLost.Number > Pnl.Number)
            {
                _MaxLost.Number = Pnl.Number;
            }
            if (TestStepDelayMS > 0)
            {
                Thread.Sleep(TestStepDelayMS);
            }
        }