1. 程式人生 > >一步一步教你寫股票走勢圖——K線圖三(新增均線)

一步一步教你寫股票走勢圖——K線圖三(新增均線)

在開篇之前,給大家出個小演算法題,一定要做哦,因為既然你打算看本章節內容了,那麼這個小演算法必須得會的喲!

有一組數,1、2、3……99、100,一共一百個數,假設是ListA,現在將
ListA索引為0、1、2、3、4的數相加之和賦給ListB索引為4的數
ListA索引為1、2、3、4、5的數相加之和賦給ListB索引為5的數 ……(以此類推)
ListA索引為95、96、97、98、99的數相加之和賦給ListB索引為99的數
讓你打印出ListB裡面所有的資料,ListB中前4位的值可以用0代替

趕緊動手試一試吧,小演算法一個哦,不難的!最好5分鐘之內出答案哦!

(片刻之後)。。。

想必大家都動手試過了吧,有人已經做好了,有人還在琢磨呢,那得反思一下啦,演算法題很多大公司面試都會出,考驗你邏輯能力,不足的人空閒得惡補一下啊,博主表示自己演算法也不咋樣,簡單點的還能應付,稍微複雜點就歇菜咯!

我們簡單貼下程式碼吧

        listA = new ArrayList<>();
        listB = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            listA.add(i, i);
        }
        for
(int i = 0; i < 100; i++) { if (i >= 4) { sum = 0; listB.add(i, fund(i - 4, i)); } else { listB.add(i, 0); } } for (int i = 0; i < 100; i++) { Log.e("OUT", listB.get(i) + ""); } private
Integer fund(Integer a, Integer b) { for (int i = a; i <= b; i++) { sum += listA.get(i); } return sum; }

So Easy?是不是!恍然大悟,似不似。那麼這個小演算法跟今天的內容有什麼關係呢,我們今天研究的是k線圖新增均線圖,均線圖的計算就是上面的演算法,我們看下圖先。

這裡寫圖片描述

我們看MA5的那根線,一根理解了,其他也就懂了。MA5是5日均線,從當前天往前推5天(包含當天),每天的收盤價之和除以5,得到當天的MA5值,所以相當於

ma5(5)=(1收+2收+3收+4收+5收)/5
ma5(6)=(2收+3收+4收+5收+6收)/5
……

一直到最後,是不是跟上面的演算法一模一樣。

既然知道均線值怎麼算了,那麼久簡單了,下面就直接把算好的資料,放入到折線圖中即可啦!

 for (int i = 0, j = 0; i < mData.getKLineDatas().size(); i++, j++) {
            xVals.add(mData.getKLineDatas().get(i).date + "");
            barEntries.add(new BarEntry(mData.getKLineDatas().get(i).vol, i));
            candleEntries.add(new CandleEntry(i, mData.getKLineDatas().get(i).high, mData.getKLineDatas().get(i).low, mData.getKLineDatas().get(i).open, mData.getKLineDatas().get(i).close));
            if(i>=4){
                sum=0;
                line5Entries.add(new Entry(getSum(i - 4, i)/5,i));
            }
            if(i>=9){
                sum=0;
                line10Entries.add(new Entry(getSum(i - 9, i)/10,i));
            }
            if(i>=29){
                sum=0;
                line30Entries.add(new Entry(getSum(i - 29, i)/30,i));
            }

        }


     ArrayList<ILineDataSet> sets = new ArrayList<ILineDataSet>();
        sets.add(setMaLine(5,xVals, line5Entries));
        sets.add(setMaLine(10,xVals, line10Entries));
        sets.add(setMaLine(30, xVals, line30Entries));


        CombinedData combinedData=new CombinedData(xVals);
        LineData lineData=new LineData(xVals,sets);
        combinedData.setData(candleData);
        combinedData.setData(lineData);
        combinedchart.setData(combinedData);

setMaLine方法

  @NonNull
    private LineDataSet setMaLine(int ma,ArrayList<String> xVals, ArrayList<Entry> lineEntries) {
        LineDataSet lineDataSetMa = new LineDataSet(lineEntries, "ma"+ma);
        lineDataSetMa.setDrawValues(false);
        if(ma==5) {
            lineDataSetMa.setColor(Color.GREEN);
        }else if(ma==10){
            lineDataSetMa.setColor(Color.GRAY);
        }else{
            lineDataSetMa.setColor(Color.YELLOW);
        }
        lineDataSetMa.setLineWidth(1f);
        lineDataSetMa.setDrawCircles(false);
        lineDataSetMa.setAxisDependency(YAxis.AxisDependency.LEFT);
        lineDataSetMa.setHighlightEnabled(false);
        return lineDataSetMa;
    }

如果看程式碼比較亂的,直接看demo即可,均線圖部分相對來說比較簡單,不需要自定義功能模組,只是單純的使用了MP庫的東西,有的公司甚至不需要客戶端進行計算均值,服務端直接算好返回了,那就更簡單了,省去計算的模組。我們來試試看效果吧!

這裡寫圖片描述

完美!如有問題,歡迎留言!均線新增告一段落,下面難點在於高亮和載入更多兩個模組,這兩個模組都還在研究中,說實話,感覺還是有點難度的,只要大家給力的star了,那麼樓主也會給力的研究並且開源的!