/// <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); }
/// <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); }
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()); } }
/// <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); }
/// <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 }); }