예제 #1
0
        public List <TimeValueObject> GetEfficiencyTrace()
        {
            List <TimeValueObject> l = new List <TimeValueObject>();

            CurrentValueList.ForEach(v =>
            {
                var value = new TimeValueObject()
                {
                    Time = v.Time
                };
                if (IsUnlimited)
                {
                    if (_MaxCapital != 0)
                    {
                        value.Value = value.DoubleValue / _MaxCapital;
                    }
                }
                else
                {
                    if (testStartValue.Number != 0)
                    {
                        value.Value = (value.DoubleValue - testStartValue.Number) / testStartValue.Number;
                    }
                }
                l.Add(value);
            });
            return(l);
        }
예제 #2
0
        List <double> GetMA(List <IMarketData> marketDataList, int n)
        {
            try
            {
                var      valueList = new List <double>();
                int      begin     = 0;
                int      rlength   = 0;
                int      rbegin    = 0;
                double[] values    = new double[marketDataList.Count];
                var      dataList  = marketDataList.Select(v => v.Close).ToArray();
                Core.Sma(begin, marketDataList.Count - 1, dataList, n, out rbegin, out rlength, values);
                valueList = values.ToList();
                CommonProc.TrimDoubleList(valueList);
                if (IsAnalyse)
                {
                    if (valueList.Count > 0)
                    {
                        var o = new TimeValueObject()
                        {
                            Name = Name, Value = valueList.LastOrDefault()
                        };
                        o.Time = marketDataList.LastOrDefault().Time;
                        AddReference(n.ToString(), o);
                    }
                }

                return(valueList);
            }
            catch (Exception ex)
            {
                LogSupport.Error(ex);
                throw ex;
            }
        }
예제 #3
0
        protected override ISignal Calculate(IInstrument instrument, DateTime startTime, DateTime endTime, MarketDataGrade?grade)
        {
            isSignalBiggerMeansBetter = true;
            if (grade == null)
            {
                grade = Grade;
            }
            try
            {
                var dl  = AnalyseDataSource.GetDataList(instrument, startTime, endTime, grade.Value);
                var RSI = new double[dl.Count];

                int bindex;
                int element;

                Core.Rsi(0, dl.Count - 1, dl.Select(p => p.Close).ToArray(),
                         Period, out bindex, out element, RSI);
                var valueList = RSI.ToList();
                CommonProc.TrimDoubleList(valueList);
                if (IsAnalyse)
                {
                    //if (!AnalyseValueList.ContainsKey("RSI"))
                    //{
                    //    AnalyseValueList.Add("RSI", new List<TimeValueObject>());
                    //}


                    if (valueList.Count > 0)
                    {
                        //AddSignal(instrument, dl.Max(v => v.Time), valueList.LastOrDefault(), dl.LastOrDefault().Close, "RSI", SignalType.Analyse);
                        var obj = new TimeValueObject()
                        {
                            Name = Name, Value = valueList.LastOrDefault()
                        };
                        obj.Time = dl.Max(v => v.Time);
                        AddReference("RSI", obj);
                        //AnalyseValueList["RSI"].Add(obj);
                        //var dif = dl.Count - valueList.Count;
                        //for (int i = valueList.Count - 1; i >= 0; i--)
                        //{

                        //    var o = new TimeValueObject() { Name = Name, Value = valueList[i] };
                        //    o.Time = dl[dif + i].Time;
                        //    AddReference("RSI", o);
                        //}
                    }
                }
                //var o = new TimeValueObject() { Name = Name, Time = endTime, Value = null };
                //o.Time = dl.Max(v => v.Time);
                //o.Value = RSI.ToArray().LastOrDefault();
                return(CreateSignal(instrument, dl.Max(v => v.Time), RSI.ToArray().LastOrDefault(), dl.LastOrDefault().Close));
            }
            catch (Exception e)
            {
                LogSupport.Error(e);
            }
            return(null);
        }
예제 #4
0
        List <double> GetMA(List <IMarketData> marketDataList, int n)
        {
            try
            {
                var valueList = new List <double>();
                int begin     = 0;
                int rlength   = 0;
                int rbegin    = 0;
                //if (MarketDataList.Count > n) { begin = MarketDataList.Count - n; }
                double[] values   = new double[marketDataList.Count];
                var      dataList = marketDataList.Select(v => v.Close).ToArray();
                Core.Sma(begin, marketDataList.Count - 1, dataList, n, out rbegin, out rlength, values);
                valueList = values.ToList();
                CommonProc.TrimDoubleList(valueList);
                if (IsAnalyse)
                {
                    //if (!AnalyseValueList.ContainsKey(n.ToString()))
                    //{
                    //    AnalyseValueList.Add(n.ToString(), new List<TimeValueObject>());
                    //}


                    if (valueList.Count > 0)
                    {
                        //var data = marketDataList.FirstOrDefault();
                        //AddSignal(data.InstrumentTicker, marketDataList.Max(v => v.Time), valueList.LastOrDefault(), marketDataList.LastOrDefault().Close, n.ToString(), SignalType.Analyse);
                        //var dif = marketDataList.Count - valueList.Count;
                        //for (int i =  valueList.Count-1 ;i>=0; i--)
                        //{

                        var o = new TimeValueObject()
                        {
                            Name = Name, Value = valueList.LastOrDefault()
                        };
                        o.Time = marketDataList.LastOrDefault().Time;
                        AddReference(n.ToString(), o);
                        //}
                    }
                }

                //for (int i = 0; i < values.Length - n + 1; i++)
                //{

                //    valueList.Add(values[i]);
                //}
                return(valueList);
            }
            catch (Exception ex)
            {
                LogSupport.Error(ex);
                throw ex;
            }
        }
예제 #5
0
        protected void AddReference(string name, TimeValueObject value)
        {
            if (!ReferenceValueList.ContainsKey(name))
            {
                ReferenceValueList.Add(name, new List <TimeValueObject>());
            }
            var l   = ReferenceValueList[name];
            var obj = l.FirstOrDefault(v => v.Time == value.Time && v.TargetName == value.TargetName);

            if (obj != null)
            {
                l.Remove(obj);
            }
            l.Add(value);
        }
예제 #6
0
        protected override ISignal Calculate(IInstrument instrument, DateTime startTime, DateTime endTime, MarketDataGrade?grade)
        {
            isSignalBiggerMeansBetter = true;
            if (grade == null)
            {
                grade = Grade;
            }
            try
            {
                var dl = GetMarketData(instrument, startTime, endTime, grade.Value);
                if (dl.Count == 0)
                {
                    return(null);
                }
                var macd       = new double[dl.Count];
                var macdhis    = new double[dl.Count];
                var macdsignal = new double[dl.Count];
                int bindex;
                int element;

                Core.Macd(0, dl.Count - 1, dl.Select(p => p.Close).ToArray(), FastPeriod, SlowPeriod, SignalPeriod, out bindex, out element, macd, macdsignal, macdhis);
                var signal = macdsignal.ToList();
                CommonProc.TrimDoubleList(signal);
                if (IsAnalyse)
                {
                    var macdList = macd.ToList();
                    CommonProc.TrimDoubleList(macdList);
                    var his = macdhis.ToList();
                    CommonProc.TrimDoubleList(his);
                    //if (!AnalyseValueList.ContainsKey("MACD"))
                    //{
                    //    AnalyseValueList.Add("MACD", new List<TimeValueObject>());
                    //}
                    //if (!AnalyseValueList.ContainsKey("Signal"))
                    //{
                    //    AnalyseValueList.Add("Signal", new List<TimeValueObject>());
                    //}
                    //if (!AnalyseValueList.ContainsKey("His"))
                    //{
                    //    AnalyseValueList.Add("His", new List<TimeValueObject>());
                    //}
                    if (macdList.Count > 0)
                    {
                        //AddSignal(instrument, dl.Max(v => v.Time), macdList.LastOrDefault(), dl.LastOrDefault().Close, "MACD", SignalType.Analyse);
                        //var dif = dl.Count - macdList.Count;
                        //for (int i = macdList.Count - 1; i >= 0; i--)
                        //{

                        //    var o = new TimeValueObject() { Name = Name, Value = macdList[i] };
                        //    o.Time = dl[dif + i].Time;
                        //    AddReference("MACD", o);
                        //}
                        var o = new TimeValueObject()
                        {
                            Name = Name, Value = macdList.LastOrDefault()
                        };
                        o.Time = dl.Max(v => v.Time);
                        AddReference("MACD", o);
                    }
                    if (signal.Count > 0)
                    {
                        //var dif = dl.Count - signal.Count;
                        //for (int i = signal.Count - 1; i >= 0; i--)
                        //{

                        //    var o = new TimeValueObject() { Name = Name, Value = signal[i] };
                        //    o.Time = dl[dif + i].Time;
                        //    AddReference("Signal", o);
                        //}
                        //AddSignal(instrument, dl.Max(v => v.Time), signal.LastOrDefault(), dl.LastOrDefault().Close, "Signal", SignalType.Analyse);
                        var o = new TimeValueObject()
                        {
                            Name = Name, Value = signal.LastOrDefault()
                        };
                        o.Time = dl.Max(v => v.Time);
                        AddReference("Signal", o);
                        //AnalyseValueList["Signal"].Add(o);
                    }
                    if (his.Count > 0)
                    {
                        //var dif = dl.Count - his.Count;
                        //for (int i = his.Count - 1; i >= 0; i--)
                        //{

                        //    var o = new TimeValueObject() { Name = Name, Value = his[i] };
                        //    o.Time = dl[dif + i].Time;
                        //    AddReference("His", o);
                        //}
                        //AddSignal(instrument, dl.Max(v => v.Time), his.LastOrDefault(), dl.LastOrDefault().Close, "His", SignalType.Analyse);
                        var o = new TimeValueObject()
                        {
                            Name = Name, Value = his.LastOrDefault()
                        };
                        o.Time = dl.Max(v => v.Time);
                        AddReference("His", o);
                        //AnalyseValueList["His"].Add(o);
                    }
                }
                if (signal.Count > 1 && signal[signal.Count - 2] < 0 && signal[signal.Count - 1] > 0)
                {
                    //var o = new TimeValueObject() { Name = Name, Time = dl.Max(v=>v.Time), Value = null };
                    //o.Value = signal[signal.Count - 1] - signal[signal.Count - 2];

                    //return o;
                    return(CreateSignal(instrument, dl.Max(v => v.Time), signal[signal.Count - 1] - signal[signal.Count - 2], dl.LastOrDefault().Close));
                }
            }
            catch (Exception e)
            {
                //LogSupport.Error(e);
            }
            return(null);
        }
예제 #7
0
        protected override ISignal Calculate(IInstrument instrument, DateTime startTime, DateTime endTime, MarketDataGrade?grade)
        {
            isSignalBiggerMeansBetter = true;
            if (grade == null)
            {
                grade = Grade;
            }
            try
            {
                var dl    = AnalyseDataSource.GetDataList(instrument, startTime, endTime, grade.Value);
                var slowK = new double[dl.Count];
                var slowD = new double[dl.Count];

                int bindex;
                int element;

                Core.Stoch(0, dl.Count - 1, dl.Select(p => p.High).ToArray(), dl.Select(p => p.Low).ToArray(), dl.Select(p => p.Close).ToArray(),
                           FastKPeriod, SlowKPeriod, SlowKType, SlowDPeriod, SlowDType, out bindex, out element, slowK, slowD);
                var skl = slowK.ToList <double>();
                var sdl = slowD.ToList <double>();
                CommonProc.TrimDoubleList(skl);
                CommonProc.TrimDoubleList(sdl);
                if (IsAnalyse)
                {
                    //if (!AnalyseValueList.ContainsKey("K"))
                    //{
                    //    AnalyseValueList.Add("K", new List<TimeValueObject>());
                    //}
                    //if (!AnalyseValueList.ContainsKey("D"))
                    //{
                    //    AnalyseValueList.Add("D", new List<TimeValueObject>());
                    //}
                    if (skl.Count > 0)
                    {
                        //var dif = dl.Count - skl.Count;
                        //for (int i = skl.Count - 1; i >= 0; i--)
                        //{

                        //    var o = new TimeValueObject() { Name = Name, Value = skl[i] };
                        //    o.Time = dl[dif + i].Time;
                        //    AddReference("K", o);
                        //}
                        var o = new TimeValueObject()
                        {
                            Name = Name, Value = skl.LastOrDefault()
                        };
                        o.Time = dl.Max(v => v.Time);
                        AddReference("K", o);
                        //AddSignal(instrument, dl.Max(v => v.Time), skl.LastOrDefault(), dl.LastOrDefault().Close, "K", SignalType.Analyse);
                        //AnalyseValueList["K"].Add(o);
                    }
                    if (sdl.Count > 0)
                    {
                        //var dif = dl.Count - sdl.Count;
                        //for (int i = skl.Count - 1; i >= 0; i--)
                        //{

                        //    var o = new TimeValueObject() { Name = Name, Value = sdl[i] };
                        //    o.Time = dl[dif + i].Time;
                        //    AddReference("D", o);
                        //}
                        var o = new TimeValueObject()
                        {
                            Name = Name, Value = sdl.LastOrDefault()
                        };
                        o.Time = dl.Max(v => v.Time);
                        AddReference("D", o);
                        //AnalyseValueList["D"].Add(o);
                        //AddSignal(instrument, dl.Max(v => v.Time), sdl.LastOrDefault(), dl.LastOrDefault().Close, "D", SignalType.Analyse);
                    }
                }
                if (skl[skl.Count - 2] < skl[skl.Count - 1] && sdl[sdl.Count - 2] < sdl[sdl.Count - 1])//current K,D increase
                {
                    return(CreateSignal(instrument, dl.Max(v => v.Time), ((skl[skl.Count - 1] - skl[skl.Count - 2]) + (sdl[sdl.Count - 1] - sdl[sdl.Count - 2])) / 2d, dl.LastOrDefault().Close));
                    //var o = new TimeValueObject() { Name = Name, Time = endTime, Value = null };
                    //o.Time = dl.Max(v => v.Time);
                    //o.Value= ((skl[skl.Count - 1] - skl[skl.Count - 2]) + (sdl[sdl.Count - 1] - sdl[sdl.Count - 2])) / 2d;
                    //return o;
                }
            }
            catch (Exception e)
            {
                LogSupport.Error(e);
            }
            return(null);
        }