JS实现MA、BOLL指标计算

MA指标

1.计算公式 1.N日MA=N日收市价的总和/N(即算术平均数) 2.要设置多条移动平均线,一般参数设置为N1=5,N2=10,N3=20,N4=60,N5=120,N6=250

2.代码实现

参数kline格式: let kline=[{‘symbol’: ‘000001.SH’, ‘date’: ‘2019-02-13’, ‘open’: 2674.52, ‘close’: 2721.07, ‘high’: 2727.07, ‘low’: 2666.52, ‘vol’: ‘24379401000’}];

/**
     * 计算指定周期的若干 MA 均线
     * @param kline K线
     * @param params tuple
     * @return {
          
   *[]} 在原始数据中新增若干 MA 均线
     */
    ma = (kline,params=[5, 10, 20, 60, 120, 250]) => {
          
   
        let len_kline=kline.length;
        let len_params=params.length;
        for(let i=0;i<len_kline;i++){
          
   
            let k=kline[i];
            for(let n=0;n<params.length;n++){
          
   
                let ma_col=ma+params[n];
                k[ma_col]=null;
            }
            for(let j=0;j<len_params;j++){
          
   
                let col=ma+params[j];
                if(i<params[j]-1){
          
   
                    break;
                }else {
          
   
                    let sum=0;
                    for(let m=0;m<params[j];m++){
          
   
                        sum+=kline[i-m].close;
                      }
                    k[col]=(sum/params[j]).toFixed(2); //保留两位小数,四舍五入
                }
            }
        }
        return kline;
    };

BOLL指标

1.代码实现

/**
     * 计算 BOLL 指标
     * BOLL线参数20,26
     * @param kline K线
     * @return {
          
   *} 在原始数据中新增 BOLL 指标结果
     */
    boll=(kline)=>{
          
   
        let len=kline.length;
        for(let i=0;i<len;i++){
          
   
            let k=kline[i];
            k.boll_mid=null;
            k.boll_tmp2=null;
            k.boll_top=null;
            k.boll_bottom=null;
            if(i<19){
          
   
                //  break;
            }else if(18<i && i<25){
          
   
                let tmp2_data=[];
                for(let m=0;m<20;m++){
          
   
                    tmp2_data.push(kline[i-m].close);
                }
                let mean = tmp2_data.reduce(this.sum)/tmp2_data.length;  //数组平均值
                let deviations = tmp2_data.map(function(x){
          
   return x-mean;}); //方差
                let std = Math.sqrt(deviations.map(this.square).reduce(this.sum)/(tmp2_data.length-1)); //标准差
                k.boll_tmp2=std.toFixed(2);
            }else{
          
   
                let tmp2_data=[];
                for(let m=0;m<20;m++){
          
   
                    tmp2_data.push(kline[i-m].close);
                }
                /*计算boll_tmp2*/
                let mean = tmp2_data.reduce(this.sum)/tmp2_data.length;  //数组平均值
                let deviations = tmp2_data.map(function(x){
          
   return x-mean;}); //方差
                let std = Math.sqrt(deviations.map(this.square).reduce(this.sum)/(tmp2_data.length-1)); //标准差


                /*计算boll_mid , boll_tmp2 ,boll-top, boll-bottom */
                let data=[];
                for(let m=0;m<26;m++){
          
   
                    data.push(kline[i-m].close);
                }
                let mid = data.reduce(this.sum)/data.length;  //数组平均值
                let top=mid+2*std;
                let bottom=mid-2*std;

                k.boll_tmp2=std.toFixed(2);
                k.boll_mid=mid.toFixed(2);
                k.boll_top=top.toFixed(2);
                k.boll_bottom=bottom.toFixed(2);
            }
        }
        return kline;

    };

    sum= function(x,y){
          
    return x+y;};  //求和函数
    square = function(x){
          
    return x*x;};  //数组中每个元素求它的平方
经验分享 程序员 微信小程序 职场和发展