MPAndroidChart的K线图上添加均线

孔大神的好东西,收藏了好好学习!

MPAndroidChart的K线图上添加均线

  • 效果图
    这里写图片描述

均线计算方法:

通常说的5日均线,10日均线,其实就是根据当前K线节点的时间维度来说的,当前每个节点代表一天,那么上面的均线就叫做日均线(几日均线),下面就统一说成几节点均线

那么5节点均线,10节点均线等等,是怎么计算出来的呢

5节点均线为例,5节点均线是从第五根柱子开始画,一直画到最后一柱子(10节点均线就是从第10根柱子开始画,画到最后一根)

用第1、2、3、4、5个节点的收盘价之和,算出一个平均值,点在第5个节点上
用第2、3、4、5、6个节点的收盘价之和,算出一个平均值,点在低6个节点上
依此类推……

最后将画在5、6、7、8……上的点连起来,就是5节点均线。(如果当前一个节点代表一天,那这条线就是5日均线)


源码

MPAndroidChart地址:https://github.com/PhilJay/MPAndroidChart

在CandleStickChartRenderer.java下添加画均线的方法

思路:在draw K线柱子的时候获取每个柱子的收盘值,根据收盘值,计算均值

Demo Code

均线的实现,请移步到在MPAndroidChart库K线图的基础上画均线

下面实现的均线是第一版,见效果图,实现逻辑上略有问题,可直接忽略

<code class="hljs avrasm has-numbering">@Override
public void drawData(Canvas c) {

    CandleData candleData = mChart<span class="hljs-preprocessor">.getCandleData</span>()<span class="hljs-comment">;</span>

    for (CandleDataSet <span class="hljs-keyword">set</span> : candleData<span class="hljs-preprocessor">.getDataSets</span>()) {

        if (<span class="hljs-keyword">set</span><span class="hljs-preprocessor">.isVisible</span>() && <span class="hljs-keyword">set</span><span class="hljs-preprocessor">.getEntryCount</span>() > <span class="hljs-number">0</span>)
            drawDataSet(c, <span class="hljs-keyword">set</span>)<span class="hljs-comment">;</span>
    }
}

protected void drawDataSet(Canvas c, CandleDataSet dataSet) {

    Transformer trans = mChart<span class="hljs-preprocessor">.getTransformer</span>(dataSet<span class="hljs-preprocessor">.getAxisDependency</span>())<span class="hljs-comment">;</span>

    float phaseX = mAnimator<span class="hljs-preprocessor">.getPhaseX</span>()<span class="hljs-comment">;</span>
    float phaseY = mAnimator<span class="hljs-preprocessor">.getPhaseY</span>()<span class="hljs-comment">;</span>

    int dataSetIndex = mChart<span class="hljs-preprocessor">.getCandleData</span>()<span class="hljs-preprocessor">.getIndexOfDataSet</span>(dataSet)<span class="hljs-comment">;</span>

    List<CandleEntry> entries = dataSet<span class="hljs-preprocessor">.getYVals</span>()<span class="hljs-comment">;</span>

    int minx = Math<span class="hljs-preprocessor">.max</span>(mMinX, <span class="hljs-number">0</span>)<span class="hljs-comment">;</span>
    int maxx = Math<span class="hljs-preprocessor">.min</span>(mMaxX + <span class="hljs-number">1</span>, entries<span class="hljs-preprocessor">.size</span>())<span class="hljs-comment">;</span>

    int range = (maxx - minx) * <span class="hljs-number">4</span><span class="hljs-comment">;</span>
    int to = (int) Math<span class="hljs-preprocessor">.ceil</span>((maxx - minx) * phaseX + minx)<span class="hljs-comment">;</span>

    CandleBodyBuffer bodyBuffer = mBodyBuffers[dataSetIndex]<span class="hljs-comment">;</span>
    bodyBuffer<span class="hljs-preprocessor">.setBodySpace</span>(dataSet<span class="hljs-preprocessor">.getBodySpace</span>())<span class="hljs-comment">;</span>
    bodyBuffer<span class="hljs-preprocessor">.setPhases</span>(phaseX, phaseY)<span class="hljs-comment">;</span>
    bodyBuffer<span class="hljs-preprocessor">.limitFrom</span>(minx)<span class="hljs-comment">;</span>
    bodyBuffer<span class="hljs-preprocessor">.limitTo</span>(maxx)<span class="hljs-comment">;</span>
    bodyBuffer<span class="hljs-preprocessor">.feed</span>(entries)<span class="hljs-comment">;</span>

    trans<span class="hljs-preprocessor">.pointValuesToPixel</span>(bodyBuffer<span class="hljs-preprocessor">.buffer</span>)<span class="hljs-comment">;</span>

    CandleShadowBuffer shadowBuffer = mShadowBuffers[dataSetIndex]<span class="hljs-comment">;</span>
    shadowBuffer<span class="hljs-preprocessor">.setPhases</span>(phaseX, phaseY)<span class="hljs-comment">;</span>
    shadowBuffer<span class="hljs-preprocessor">.limitFrom</span>(minx)<span class="hljs-comment">;</span>
    shadowBuffer<span class="hljs-preprocessor">.limitTo</span>(maxx)<span class="hljs-comment">;</span>
    shadowBuffer<span class="hljs-preprocessor">.feed</span>(entries)<span class="hljs-comment">;</span>

    trans<span class="hljs-preprocessor">.pointValuesToPixel</span>(shadowBuffer<span class="hljs-preprocessor">.buffer</span>)<span class="hljs-comment">;</span>

    mRenderPaint<span class="hljs-preprocessor">.setStrokeWidth</span>(dataSet<span class="hljs-preprocessor">.getShadowWidth</span>())<span class="hljs-comment">;</span>

    ArrayList<Float> closes = new ArrayList<Float>()<span class="hljs-comment">;</span>
    ArrayList<Float> jx = new ArrayList<Float>()<span class="hljs-comment">;</span>
    // draw the body
    for (int j = <span class="hljs-number">0</span><span class="hljs-comment">; j < range; j += 4) {</span>

        // get the entry
        CandleEntry e = entries<span class="hljs-preprocessor">.get</span>(j / <span class="hljs-number">4</span> + minx)<span class="hljs-comment">;</span>

        if (!fitsBounds(e<span class="hljs-preprocessor">.getXIndex</span>(), mMinX, to))
            continue<span class="hljs-comment">;</span>

        if (dataSet<span class="hljs-preprocessor">.getShadowColorSameAsCandle</span>()) {

            if (e<span class="hljs-preprocessor">.getOpen</span>() > e<span class="hljs-preprocessor">.getClose</span>())
                mRenderPaint<span class="hljs-preprocessor">.setColor</span>(
                        dataSet<span class="hljs-preprocessor">.getDecreasingColor</span>() == ColorTemplate<span class="hljs-preprocessor">.COLOR</span>_NONE ?
                                dataSet<span class="hljs-preprocessor">.getColor</span>(j) :
                                dataSet<span class="hljs-preprocessor">.getDecreasingColor</span>()
                )<span class="hljs-comment">;</span>

            else if (e<span class="hljs-preprocessor">.getOpen</span>() < e<span class="hljs-preprocessor">.getClose</span>())
                mRenderPaint<span class="hljs-preprocessor">.setColor</span>(
                        dataSet<span class="hljs-preprocessor">.getIncreasingColor</span>() == ColorTemplate<span class="hljs-preprocessor">.COLOR</span>_NONE ?
                                dataSet<span class="hljs-preprocessor">.getColor</span>(j) :
                                dataSet<span class="hljs-preprocessor">.getIncreasingColor</span>()
                )<span class="hljs-comment">;</span>

            else
                mRenderPaint<span class="hljs-preprocessor">.setColor</span>(
                        dataSet<span class="hljs-preprocessor">.getShadowColor</span>() == ColorTemplate<span class="hljs-preprocessor">.COLOR</span>_NONE ?
                                dataSet<span class="hljs-preprocessor">.getColor</span>(j) :
                                dataSet<span class="hljs-preprocessor">.getShadowColor</span>()
                )<span class="hljs-comment">;</span>

        } else {
            mRenderPaint<span class="hljs-preprocessor">.setColor</span>(
                    dataSet<span class="hljs-preprocessor">.getShadowColor</span>() == ColorTemplate<span class="hljs-preprocessor">.COLOR</span>_NONE ?
                            dataSet<span class="hljs-preprocessor">.getColor</span>(j) :
                            dataSet<span class="hljs-preprocessor">.getShadowColor</span>()
            )<span class="hljs-comment">;</span>
        }

        mRenderPaint<span class="hljs-preprocessor">.setStyle</span>(Paint<span class="hljs-preprocessor">.Style</span><span class="hljs-preprocessor">.STROKE</span>)<span class="hljs-comment">;</span>

        // draw the shadow
        c<span class="hljs-preprocessor">.drawLine</span>(shadowBuffer<span class="hljs-preprocessor">.buffer</span>[j], shadowBuffer<span class="hljs-preprocessor">.buffer</span>[j + <span class="hljs-number">1</span>],
                shadowBuffer<span class="hljs-preprocessor">.buffer</span>[j + <span class="hljs-number">2</span>], shadowBuffer<span class="hljs-preprocessor">.buffer</span>[j + <span class="hljs-number">3</span>],
                mRenderPaint)<span class="hljs-comment">;</span>

        float leftBody = bodyBuffer<span class="hljs-preprocessor">.buffer</span>[j]<span class="hljs-comment">;</span>
        float open = bodyBuffer<span class="hljs-preprocessor">.buffer</span>[j + <span class="hljs-number">1</span>]<span class="hljs-comment">;</span>
        float rightBody = bodyBuffer<span class="hljs-preprocessor">.buffer</span>[j + <span class="hljs-number">2</span>]<span class="hljs-comment">;</span>
        float close = bodyBuffer<span class="hljs-preprocessor">.buffer</span>[j + <span class="hljs-number">3</span>]<span class="hljs-comment">;</span>
        closes<span class="hljs-preprocessor">.add</span>(close)<span class="hljs-comment">;</span>
        jx<span class="hljs-preprocessor">.add</span>((leftBody + rightBody) / <span class="hljs-number">2</span>)<span class="hljs-comment">;</span>

        // draw body differently for increasing <span class="hljs-keyword">and</span> decreasing entry
        if (open > close) { // decreasing

            if (dataSet<span class="hljs-preprocessor">.getDecreasingColor</span>() == ColorTemplate<span class="hljs-preprocessor">.COLOR</span>_NONE) {
                mRenderPaint<span class="hljs-preprocessor">.setColor</span>(dataSet<span class="hljs-preprocessor">.getColor</span>(j / <span class="hljs-number">4</span> + minx))<span class="hljs-comment">;</span>
            } else {
                mRenderPaint<span class="hljs-preprocessor">.setColor</span>(dataSet<span class="hljs-preprocessor">.getDecreasingColor</span>())<span class="hljs-comment">;</span>
            }

            mRenderPaint<span class="hljs-preprocessor">.setStyle</span>(dataSet<span class="hljs-preprocessor">.getDecreasingPaintStyle</span>())<span class="hljs-comment">;</span>
            // draw the body
            c<span class="hljs-preprocessor">.drawRect</span>(leftBody, close, rightBody, open, mRenderPaint)<span class="hljs-comment">;</span>

        } else if (open < close) {

            if (dataSet<span class="hljs-preprocessor">.getIncreasingColor</span>() == ColorTemplate<span class="hljs-preprocessor">.COLOR</span>_NONE) {
                mRenderPaint<span class="hljs-preprocessor">.setColor</span>(dataSet<span class="hljs-preprocessor">.getColor</span>(j / <span class="hljs-number">4</span> + minx))<span class="hljs-comment">;</span>
            } else {
                mRenderPaint<span class="hljs-preprocessor">.setColor</span>(dataSet<span class="hljs-preprocessor">.getIncreasingColor</span>())<span class="hljs-comment">;</span>
            }

            mRenderPaint<span class="hljs-preprocessor">.setStyle</span>(dataSet<span class="hljs-preprocessor">.getIncreasingPaintStyle</span>())<span class="hljs-comment">;</span>
            // draw the body
            c<span class="hljs-preprocessor">.drawRect</span>(leftBody, open, rightBody, close, mRenderPaint)<span class="hljs-comment">;</span>
        } else { // equal values

            mRenderPaint<span class="hljs-preprocessor">.setColor</span>(dataSet<span class="hljs-preprocessor">.getShadowColor</span>())<span class="hljs-comment">;</span>
            c<span class="hljs-preprocessor">.drawLine</span>(leftBody, open, rightBody, close, mRenderPaint)<span class="hljs-comment">;</span>
        }

        // <span class="hljs-number">5</span>节点均线
        drawLine(c, <span class="hljs-number">5</span>, closes, jx)<span class="hljs-comment">;</span>
        // <span class="hljs-number">10</span>节点均线
        drawLine(c, <span class="hljs-number">10</span>, closes, jx)<span class="hljs-comment">;</span>
        // <span class="hljs-number">30</span>节点均线
        drawLine(c, <span class="hljs-number">30</span>, closes, jx)<span class="hljs-comment">;</span>
    }
}

<span class="hljs-comment">/**
 * 画均线
 * @param c
 * @param i
 * @param closes
 * @param jx
 */</span>
private void drawLine(Canvas c, int i, ArrayList<Float> closes, ArrayList<Float> jx) {
    Paint paint = new Paint()<span class="hljs-comment">;</span>
    // 画线宽度
    paint<span class="hljs-preprocessor">.setStrokeWidth</span>(<span class="hljs-number">1</span>)<span class="hljs-comment">;</span>
    // 画线颜色
    if (<span class="hljs-number">5</span> == i) {
        paint<span class="hljs-preprocessor">.setColor</span>(Color<span class="hljs-preprocessor">.BLUE</span>)<span class="hljs-comment">;</span>
    } else if (<span class="hljs-number">10</span> == i) {
        paint<span class="hljs-preprocessor">.setColor</span>(Color<span class="hljs-preprocessor">.RED</span>)<span class="hljs-comment">;</span>
    } else if (<span class="hljs-number">30</span> == i) {
        paint<span class="hljs-preprocessor">.setColor</span>(Color<span class="hljs-preprocessor">.BLACK</span>)<span class="hljs-comment">;</span>
    } else {
        paint<span class="hljs-preprocessor">.setColor</span>(Color<span class="hljs-preprocessor">.GREEN</span>)<span class="hljs-comment">;</span>
    }

    if (closes<span class="hljs-preprocessor">.size</span>() >= i + <span class="hljs-number">1</span>) {
        float startX = jx<span class="hljs-preprocessor">.get</span>(closes<span class="hljs-preprocessor">.size</span>() - <span class="hljs-number">2</span>)<span class="hljs-comment">;</span>
        float startY = <span class="hljs-number">0</span><span class="hljs-comment">;</span>
        for (int <span class="hljs-built_in">x</span> = <span class="hljs-number">0</span><span class="hljs-comment">; x < i; x++) {</span>
            startY += closes<span class="hljs-preprocessor">.get</span>(closes<span class="hljs-preprocessor">.size</span>() - <span class="hljs-number">2</span> - <span class="hljs-built_in">x</span>)<span class="hljs-comment">;</span>
        }
        startY = startY / i<span class="hljs-comment">;</span>
        float endX = jx<span class="hljs-preprocessor">.get</span>(closes<span class="hljs-preprocessor">.size</span>() - <span class="hljs-number">1</span>)<span class="hljs-comment">;</span>
        float endY = <span class="hljs-number">0</span><span class="hljs-comment">;</span>
        for (int <span class="hljs-built_in">y</span> = <span class="hljs-number">0</span><span class="hljs-comment">; y < i; y++) {</span>
            endY += closes<span class="hljs-preprocessor">.get</span>(closes<span class="hljs-preprocessor">.size</span>() - <span class="hljs-number">1</span> - <span class="hljs-built_in">y</span>)<span class="hljs-comment">;</span>
        }
        endY = endY / i<span class="hljs-comment">;</span>
        c<span class="hljs-preprocessor">.drawLine</span>(startX, startY, endX, endY, paint)<span class="hljs-comment">;</span>
    }
}</code>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值