Android開發(fā)之基于MPAndroidChart實(shí)現(xiàn)股票K線圖(三)

接上文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)三種鲫骗。

日K線圖和平均線

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.

CombinedChartCandleStickChart以及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ù)排苍。
那么沦寂,代碼流程如下:

  1. 構(gòu)建好CandleData以及LineData
  2. 通過(guò)CombinedData.setData(CandleData data)CombinedData.setData(LineData data)完成組合圖中的數(shù)據(jù)模型構(gòu)建
  3. 最后通過(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"/>
  1. 構(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;
}```
  1. 構(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ù)
    }
  1. 大功告成
    做完以上的數(shù)據(jù)初始化工作以后彤守,只剩最后一步毯侦,更新CombinedChart:
 mChart.setData(combinedData);//當(dāng)前屏幕會(huì)顯示所有的數(shù)據(jù)
 mChart.animateX(1500);
最終效果:日K+MA5\MA10\MA20

4 總結(jié)

強(qiáng)大的MPAndroidChart庫(kù) 支持繪制多種圖表,不同的Chart之間的設(shè)置方法基本一致具垫,setData()萬(wàn)變不離其宗叫惊。

5 Demo源碼

github_KLineChartDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市做修,隨后出現(xiàn)的幾起案子霍狰,更是在濱河造成了極大的恐慌,老刑警劉巖饰及,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔗坯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡燎含,警方通過(guò)查閱死者的電腦和手機(jī)宾濒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屏箍,“玉大人绘梦,你說(shuō)我怎么就攤上這事橘忱。” “怎么了卸奉?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵钝诚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我榄棵,道長(zhǎng)凝颇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任疹鳄,我火速辦了婚禮拧略,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘪弓。我一直安慰自己垫蛆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布腺怯。 她就那樣靜靜地躺著袱饭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓢喉。 梳的紋絲不亂的頭發(fā)上宁赤,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天舀透,我揣著相機(jī)與錄音栓票,去河邊找鬼。 笑死愕够,一個(gè)胖子當(dāng)著我的面吹牛走贪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惑芭,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼坠狡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了遂跟?” 一聲冷哼從身側(cè)響起逃沿,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幻锁,沒(méi)想到半個(gè)月后凯亮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宛逗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羽峰。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箱亿,死狀恐怖粟矿,靈堂內(nèi)的尸體忽然破棺而出侣颂,到底是詐尸還是另有隱情胯甩,我是刑警寧澤啃沪,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布粘拾,位于F島的核電站,受9級(jí)特大地震影響谅阿,放射性物質(zhì)發(fā)生泄漏半哟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一签餐、第九天 我趴在偏房一處隱蔽的房頂上張望寓涨。 院中可真熱鬧,春花似錦氯檐、人聲如沸戒良。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)糯崎。三九已至,卻和暖如春河泳,著一層夾襖步出監(jiān)牢的瞬間沃呢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工拆挥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薄霜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓纸兔,卻偏偏與公主長(zhǎng)得像惰瓜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汉矿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容