接上文Android開發(fā)之基于MPAndroidChart實(shí)現(xiàn)股票K線圖(二)挠乳,實(shí)現(xiàn)了最基本的K線圖效果后涝婉,接下來(lái)要做的事便是引入移動(dòng)平均線财忽。
1 介紹
移動(dòng)平均線(Moving Average丑掺,簡(jiǎn)稱MA)媳谁,它是將某一段時(shí)間的收盤價(jià)之和除以該周期党饮。 比如日線MA5指5天內(nèi)的收盤價(jià)除以5 肝陪。通常情況下,日K線圖和平均線放在同一張圖里分析刑顺,最簡(jiǎn)單的分析思路就是 比較證券價(jià)格移動(dòng)平均線與證券自身價(jià)格的關(guān)系见坑。當(dāng)證券價(jià)格上漲嚷掠,高于其移動(dòng)平均線,則產(chǎn)生購(gòu)買信號(hào)荞驴。當(dāng)證券價(jià)格下跌不皆,低于其移動(dòng)平均線,則產(chǎn)生出售信號(hào)熊楼。
在每日K線圖上常出現(xiàn)的是5日均線(MA5)霹娄、10日均線(MA10)、20日均線(MA20)三種鲫骗。
2 代碼思路
現(xiàn)在的需求就是 使用MPAndroidChart在畫出日K線圖和移動(dòng)平均線犬耻,也就是說(shuō) 要在同一個(gè)坐標(biāo)系下,同時(shí)畫出K線圖(CandleStickChart
)和折線圖(LineChart
)执泰。而框架提供了一個(gè)強(qiáng)大的CombinedChart
讓我們?nèi)ダL制這種組合圖形枕磁。
public class CombinedChart
This chart class allows the combination of lines, bars, scatter and candle data all displayed in one chart area.
CombinedChart
和CandleStickChart
以及LineChart
的使用方式差不多。都是通過(guò)chart.setData()
方法將數(shù)據(jù)以及相關(guān)設(shè)置傳遞到圖表中并展示出來(lái)术吝。
public class CombinedChart{
......
public void setData(CombinedData data)
}
那么關(guān)鍵就是如何去構(gòu)建這個(gè)CombinedData
實(shí)例计济。
public Class CombinedData{
......
void setData(BarData data)
void setData(BubbleData data)
void setData(CandleData data)
void setData(LineData data)
void setData(ScatterData data)
}
可以發(fā)現(xiàn),CombinedData
可以通過(guò)簡(jiǎn)單的setData方法來(lái)設(shè)置我們?cè)?code>CombinedChart中要顯示的圖表數(shù)據(jù)排苍。
那么沦寂,代碼流程如下:
- 構(gòu)建好
CandleData
以及LineData
- 通過(guò)
CombinedData.setData(CandleData data)
和CombinedData.setData(LineData data)
完成組合圖中的數(shù)據(jù)模型構(gòu)建 - 最后通過(guò)
CombinedChart.setData(CombinedData data)
便輕松繪制出日K線圖+移動(dòng)平均線的股票價(jià)格圖表!
3 核心代碼
First of all,在Activity的布局中中加入CombinedChart
:
<com.github.mikephil.charting.charts.CombinedChart
android:id="@+id/chart"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 構(gòu)建CandleData
private CandleData generateCandleData() {
List<CandleEntry> candleEntries = Model.getCandleEntries();
CandleDataSet set = new CandleDataSet(candleEntries, "");
set.setAxisDependency(YAxis.AxisDependency.LEFT);
set.setShadowWidth(0.7f);
set.setDecreasingColor(Color.RED);
set.setDecreasingPaintStyle(Paint.Style.FILL);
set.setIncreasingColor(Color.GREEN);
set.setIncreasingPaintStyle(Paint.Style.STROKE);
set.setNeutralColor(Color.RED);
set.setShadowColorSameAsCandle(true);
set.setHighlightLineWidth(0.5f);
set.setHighLightColor(Color.WHITE);
set.setDrawValues(false);
CandleData candleData = new CandleData(xVals);
candleData.addDataSet(set);
return candleData;
}```
2. 指定數(shù)據(jù)淘衙、線顏色传藏、標(biāo)簽生成LineDataSet
private LineDataSet generateLineDataSet(List<Entry> entries, int color, String label) {
LineDataSet set = new LineDataSet(entries, label);
set.setColor(color);
set.setLineWidth(1f);
set.setDrawCubic(true);//圓滑曲線
set.setDrawCircles(false);
set.setDrawCircleHole(false);
set.setDrawValues(false);
set.setHighlightEnabled(false);
set.setAxisDependency(YAxis.AxisDependency.LEFT);
return set;
}
3. 構(gòu)建LineData:MA5\MA10\MA20三條折線圖對(duì)應(yīng)不同的數(shù)據(jù)和折線顏色(這些通過(guò)LineDataSet指定),所以傳入一個(gè)LineDataSet數(shù)組來(lái)構(gòu)建LineData
private LineData generateMultiLineData(LineDataSet... lineDataSets) {
List<ILineDataSet> dataSets = new ArrayList<>();
for (int i = 0; i < lineDataSets.length; i++) {
dataSets.add(lineDataSets[i]);
}
LineData data = new LineData(xVals, dataSets);
return data;
}```
- 構(gòu)建CombineData
private void loadChartData() {
mChart.resetTracking();
candleEntries = Model.getCandleEntries();//模擬獲取日K圖數(shù)據(jù)集合
itemcount = candleEntries.size();
List<StockListBean.StockBean> stockBeans = Model.getData();
xVals = new ArrayList<>();//X軸坐標(biāo)集合
for (int i = 0; i < itemcount; i++) {
xVals.add(stockBeans.get(i).getDate());
}
CombinedData combinedData = new CombinedData(xVals);
/*k line*/
candleData = generateCandleData();
combinedData.setData(candleData);//加入K線圖數(shù)據(jù)
/*ma5*/
ArrayList<Entry> ma5Entries = new ArrayList<Entry>();
for (int index = 0; index < itemcount; index++) {
ma5Entries.add(new Entry(stockBeans.get(index).getMa5(), index));
}
/*ma10*/
ArrayList<Entry> ma10Entries = new ArrayList<Entry>();
for (int index = 0; index < itemcount; index++) {
ma10Entries.add(new Entry(stockBeans.get(index).getMa10(), index));
}
/*ma20*/
ArrayList<Entry> ma20Entries = new ArrayList<Entry>();
for (int index = 0; index < itemcount; index++) {
ma20Entries.add(new Entry(stockBeans.get(index).getMa20(), index));
}
lineData = generateMultiLineData(//包含三種折線圖的LineData
generateLineDataSet(ma5Entries, colorMa5, "ma5"),
generateLineDataSet(ma10Entries, colorMa10, "ma10"),
generateLineDataSet(ma20Entries, colorMa20, "ma20"));
combinedData.setData(lineData);//加入MA5\MA10\MA20三種折線圖數(shù)據(jù)
}
- 大功告成
做完以上的數(shù)據(jù)初始化工作以后彤守,只剩最后一步毯侦,更新CombinedChart:
mChart.setData(combinedData);//當(dāng)前屏幕會(huì)顯示所有的數(shù)據(jù)
mChart.animateX(1500);
4 總結(jié)
強(qiáng)大的MPAndroidChart庫(kù) 支持繪制多種圖表,不同的Chart
之間的設(shè)置方法基本一致具垫,setData()
萬(wàn)變不離其宗叫惊。