Beispiel #1
0
        /// <summary>
        /// VAR0:=(2*CLOSE+HIGH+LOW)/4;
        /// B:=XMA((VAR0-LLV(LOW,30))/(HHV(HIGH,30)-LLV(LOW,30))*100,12);
        /// 主力做多资金:EMA(B,3),LINETHICK2,COLORWHITE;
        /// </summary>
        /// <param name="kline"></param>
        /// <param name="begin"></param>
        /// <param name="end"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static TimeSeries <ITimeSeriesItem <double> > indicator_fund_main1(this KLine kline, int begin = 0, int end = 0, PropertyDescriptorCollection param = null)
        {
            TimeSeries <ITimeSeriesItem <double> > close = kline.Select <double>("CLOSE", begin, end);
            TimeSeries <ITimeSeriesItem <double> > open  = kline.Select <double>("OPEN", begin, end);
            TimeSeries <ITimeSeriesItem <double> > high  = kline.Select <double>("HIGH", begin, end);
            TimeSeries <ITimeSeriesItem <double> > low   = kline.Select <double>("LOW", begin, end);
            TimeSeries <ITimeSeriesItem <double> > VAR0  = (close * 2.0 + open + low) / 4;


            TimeSeries <ITimeSeriesItem <double> > t1 = VAR0 - low.LLV(30);
            TimeSeries <ITimeSeriesItem <double> > t2 = high.HHV(30) - low.LLV(30);

            TimeSeries <ITimeSeriesItem <double> > t3 = (t1 / t2) * 100;

            TimeSeries <ITimeSeriesItem <double> > B = t3.XMA(12);

            TimeSeries <ITimeSeriesItem <double> > results = B.EMA(3);

            return(results);
        }
Beispiel #2
0
        /// <summary>
        /// VAR0:=(2*CLOSE+HIGH+LOW)/4;
        /// B:=XMA((VAR0-LLV(LOW,30))/(HHV(HIGH,30)-LLV(LOW,30))*100,12);
        /// 主力做多资金:EMA(B,3),LINETHICK2,COLORWHITE;
        /// </summary>
        /// <param name="kline"></param>
        /// <param name="begin"></param>
        /// <param name="end"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public static TimeSeries <ITimeSeriesItem <List <double> > > executeIndicator(this KLine kline, int begin = 0, int end = 0, PropertyDescriptorCollection param = null)
        {
            TimeSeries <ITimeSeriesItem <double> > close = kline.Select <double>("CLOSE", begin, end);
            TimeSeries <ITimeSeriesItem <double> > open  = kline.Select <double>("OPEN", begin, end);
            TimeSeries <ITimeSeriesItem <double> > high  = kline.Select <double>("HIGH", begin, end);
            TimeSeries <ITimeSeriesItem <double> > low   = kline.Select <double>("LOW", begin, end);
            TimeSeries <ITimeSeriesItem <double> > VAR0  = (close * 2.0 + high + low) / 4;


            TimeSeries <ITimeSeriesItem <double> > t1 = VAR0 - low.LLV(20);
            TimeSeries <ITimeSeriesItem <double> > t2 = high.HHV(20) - low.LLV(20);

            TimeSeries <ITimeSeriesItem <double> > t3 = (t1 / t2) * 100;

            //TimeSeries<ITimeSeriesItem<double>> B = t3.XMA(12);
            TimeSeries <ITimeSeriesItem <double> > B = t3.EMA(12);

            TimeSeries <ITimeSeriesItem <double> > mainforces = B.EMA(3);

            TimeSeries <ITimeSeriesItem <double> > retailInverstors = mainforces.EMA(30);


            TimeSeries <ITimeSeriesItem <List <double> > > results = new TimeSeries <ITimeSeriesItem <List <double> > >();

            foreach (ITimeSeriesItem <double> mainforce in mainforces)
            {
                TimeSeriesItem <List <double> > r = new TimeSeriesItem <List <double> >();
                r.Value = new List <double>(new double[2] {
                    0, 0
                });

                r.Date     = mainforce.Date;
                r.Value[0] = mainforce.Value;

                ITimeSeriesItem <double> retailInverstor = retailInverstors[r.Date];
                r.Value[1] = retailInverstor == null ? 0 : retailInverstor.Value;

                results.Add(r);
            }
            return(results);
        }
Beispiel #3
0
        public void Execute()
        {
            List <String> codes = new List <string>();

            System.IO.File.ReadAllLines(FileUtils.GetDirectory() + "test.csv")
            .ToList().ForEach(x => codes.Add(x.Split(',')[1]));


            IndicatorRepository repository = new IndicatorRepository("d:\\repository\\");

            repository.Initilization();


            foreach (String code in codes)
            {
                //生成数据
                TimeSerialsDataSet ds = repository[code];
                KLine dayLine         = ds.DayKLine;
                KLine weekLine        = dayLine.CreateWeek();
                ds.WeekKLine = weekLine;

                TimeSeries <ITimeSeriesItem <double> > dayClose  = dayLine.Select <double>("close", 0, 0);
                TimeSeries <ITimeSeriesItem <double> > weekClose = weekLine.Select <double>("close", 0, 0);

                TradingLine dayTradeLine  = ds.CubeCreateOrLoad(TimeUnit.day);
                TradingLine weekTradeLine = ds.CubeCreateOrLoad(TimeUnit.week);

                TimeSeries <ITimeSeriesItem <List <double> > > dayFunds  = ds.FundTrendCreate(TimeUnit.day);
                TimeSeries <ITimeSeriesItem <List <double> > > weekFunds = ds.FundTrendCreate(TimeUnit.week);

                TimeSeries <ITimeSeriesItem <double> > dayCross  = ds.FundTrendCrossCreateOrLoad(TimeUnit.day);
                TimeSeries <ITimeSeriesItem <double> > weedCross = ds.FundTrendCrossCreateOrLoad(TimeUnit.week);

                //测试买入

                List <TradeBout> bouts = new List <TradeBout>();
                TimeSeries <ITimeSeriesItem <char> > dayTradePt = dayTradeLine.buysellPoints;
                for (int i = 0; i < dayTradePt.Count; i++)
                {
                    ITimeSeriesItem <char> item = dayTradePt[i];
                    if (item.Value == 'S')
                    {
                        continue;
                    }
                    if (item.Date < begin || item.Date > end)
                    {
                        continue;
                    }
                    DateTime buyPtDate = item.Date;
                    int      index     = dayFunds.IndexOf(buyPtDate);
                    while (index <= dayFunds.Count)
                    {
                        ITimeSeriesItem <List <double> > fundItem = dayFunds[index];
                        if (fundItem == null)
                        {
                            index += 1;
                            continue;
                        }
                        if (fundItem.Value[0] <= fundItem.Value[1])
                        {
                            index += 1;
                            continue;
                        }
                        TradeBout bout      = new TradeBout(code);
                        KLineItem klineItem = dayLine.GetNearest(fundItem.Date, false);
                        if (klineItem == null)
                        {
                            index += 1;
                            continue;
                        }
                        bout.RecordTrade(1, klineItem.Date, TradeDirection.Buy, klineItem.CLOSE, (int)(funds / klineItem.CLOSE), 0, 0, "发出B点且主力=" + fundItem.Value[0].ToString("F3") + "大于散户" + fundItem.Value[1].ToString("F3") + ",日期=" + fundItem.Date.ToString("yyyyMMdd"));
                        bouts.Add(bout);
                        break;
                    }
                }
                //测试卖出
                for (int i = 0; i < bouts.Count; i++)
                {
                    DateTime buyDate  = bouts[i].BuyInfo.TradeDate;
                    int      buyIndex = dayLine.IndexOf(buyDate);
                    int      index    = buyIndex + 1;
                    while (index <= dayLine.Count - 1)
                    {
                        KLineItem item = dayLine[index];
                        if (index - buyIndex >= maxdays)
                        {
                            bouts[i].RecordTrade(2, item.Date, TradeDirection.Sell, item.CLOSE, bouts[i].BuyInfo.Amount, 0, 0, "大于" + maxdays.ToString() + "天卖出");
                            break;
                        }
                        else
                        {
                            double profile = (item.HIGH - bouts[i].BuyInfo.TradePrice) / bouts[i].BuyInfo.TradePrice;
                            if (profile >= maxProfilt)
                            {
                                bouts[i].RecordTrade(2, item.Date, TradeDirection.Sell, (bouts[i].BuyInfo.TradePrice * (1 + maxProfilt)), bouts[i].BuyInfo.Amount, 0, 0, "利润大于" + maxdays.ToString() + "天卖出");
                                break;
                            }
                        }
                        index += 1;
                    }
                }
                //去掉未完成的
                for (int i = 0; i < bouts.Count; i++)
                {
                    if (!bouts[i].Completed)
                    {
                        bouts.RemoveAt(i--);
                    }
                }

                TradeRecords tradeRecords = new TradeRecords();
                tradeRecords.Bouts.AddRange(bouts);
                //打印结果
                for (int i = 0; i < bouts.Count; i++)
                {
                    Console.WriteLine(bouts[i].ToString());
                }
                Console.WriteLine(tradeRecords.ToString());
            }
        }
Beispiel #4
0
        /// <summary>
        /// DIF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
        /// DEA:EMA(DIF, MID);
        /// MACD:(DIF-DEA)*2,COLORSTICK;
        /// 其中SHORT = 12,LONG = 26,MID = 9
        /// </summary>
        /// <param name="kline"></param>
        /// <returns></returns>
        public static MACD Create(KLine kline)
        {
            if (kline == null)
            {
                return(null);
            }
            int p_short = 12, p_long = 26, p_mid = 9;

            TimeSeries <ITimeSeriesItem <double> > CLOSE = kline.Select <double>("close");
            TimeSeries <ITimeSeriesItem <double> > DIF = CLOSE.EMA(p_short) - CLOSE.EMA(p_long);
            TimeSeries <ITimeSeriesItem <double> > DEA = DIF.EMA(p_mid);
            TimeSeries <ITimeSeriesItem <double> > MACD = (DIF - DEA) * 2;

            MACD macd = new MACD(kline.Code, kline.TimeUnit);

            double prevDif = 0, prevdea = 0;

            for (int i = 0; i < kline.Count; i++)
            {
                DateTime d    = kline[i].Date;
                MACDItem item = new MACDItem();
                item.Date = d;


                ITimeSeriesItem <double> difItem = DIF[d];
                if (difItem == null)
                {
                    continue;
                }
                item.DIF = difItem.Value;
                if (prevDif == 0)
                {
                    prevDif = difItem.Value;
                }

                ITimeSeriesItem <double> deaItem = DEA[d];
                if (deaItem == null)
                {
                    continue;
                }
                item.DEA = deaItem.Value;
                if (prevdea == 0)
                {
                    prevdea = deaItem.Value;
                }

                ITimeSeriesItem <double> macdItem = MACD[d];
                if (macdItem == null)
                {
                    continue;
                }
                item.MACD = macdItem.Value;

                if (prevDif < prevdea && difItem.Value > deaItem.Value)
                {
                    item.CROSS = difItem.Value - deaItem.Value;//金叉点
                }
                else if (prevDif > prevdea && difItem.Value < deaItem.Value)
                {
                    item.CROSS = difItem.Value - deaItem.Value;//死叉点
                }
                macd.Add(item);

                prevDif = difItem.Value;
                prevdea = deaItem.Value;
            }

            return(macd);
        }
Beispiel #5
0
        /// <summary>
        /// 买线:EMA(CLOSE,3),COLORRED,LINETHICK1;
        /// 卖线:EMA(SLOPE(CLOSE,21)*20+CLOSE,42),COLORBLUE,LINETHICK2;
        /// </summary>
        /// <param name="kline"></param>
        /// <returns></returns>
        public static TradingLine indicator_trading_stereo1(this KLine kline, int begin = 0, int end = 0)
        {
            TimeSeries <ITimeSeriesItem <double> > close = kline.Select <double>("close", begin, end);

            TimeSeries <ITimeSeriesItem <double> > buyLine       = close.EMA(3);
            TimeSeries <ITimeSeriesItem <double> > sellLine      = (close.SLOPE(21) * 20 + close).EMA(42);
            TimeSeries <ITimeSeriesItem <char> >   buysellPoints = new TimeSeries <ITimeSeriesItem <char> >();

            int buy_gt_sell = 1, sell_gt_buy = 2; //买大于卖为1,卖大于买为2
            int state = 0;                        //前一个状态

            for (int i = 0; i < buyLine.Count; i++)
            {
                ITimeSeriesItem <double> buyItem  = buyLine[i];
                ITimeSeriesItem <double> sellItem = sellLine[buyItem.Date];
                if (sellItem == null)
                {
                    continue;
                }
                double t = buyItem.Value - sellItem.Value;
                if (t == 0)
                {
                    continue;
                }
                if (state == 0)
                {
                    state = t > 0 ? buy_gt_sell : sell_gt_buy;
                    continue;
                }
                int cs = t > 0 ? buy_gt_sell : sell_gt_buy;
                if (cs == state)
                {
                    continue;
                }

                if (state == buy_gt_sell)
                {
                    TimeSeriesItem <char> v = new TimeSeriesItem <char>()
                    {
                        Date  = buyItem.Date,
                        Value = 'S'
                    };
                    buysellPoints.Add(v);
                }
                else if (state == sell_gt_buy)
                {
                    TimeSeriesItem <char> v = new TimeSeriesItem <char>()
                    {
                        Date  = buyItem.Date,
                        Value = 'B'
                    };
                    buysellPoints.Add(v);
                }
                state = cs;
            }

            return(new TradingLine()
            {
                buyLine = buyLine,
                sellLine = sellLine,
                buysellPoints = buysellPoints
            });
        }