通过新浪股票接口 实现 Echarts K线图

股票行情K线图的效果 

找到一个好的接口很重要~~(之前自己搜罗的一个接口查回来的数据 JSON  key不带引号 恶心的一匹 然后 数据也不是很好用,直接舍弃)

股票行情图接口-日K历史数据

请求

1url:{domainname}/stock/stockInformation/getBussinessLabelPoint   

POST

     Content-Type: application/json

        head:  key: headParam     value : {"device_no":"ios","devcie_name":"ios","token":"123","phone":"15202146557"}

2)请求参数:

字段名

类型

说明

code

String

股票编号

3)请求body:

  {

"code":"600519"

  }

2.返回

1)返回参数

字段名

类型

说明

status

String

返回接口状态

msg

String

返回接口信息

errorMsg

String

返回接口错误信息

success

boolean

返回接口是否成功

result

List<Object[]>

[日期,昨收,开盘,当日最高,当日最低,当前价,成交量,成交额,买卖点]

2)返回body:

{

    "status": "200",

    "msg": "操作成功",

    "errorMsg": "",

    "result": [

        [

            "20180622",

            "759.32",

            "754.0",

            "767.0",

            "750.0",

            "767.0",

            "28854.0",

            "0",

            "0"

        ],

        [

            "20160104",

            "",

            "207.277",

            "207.277",

            "199.661",

            "200.0",

            "17349.0",

            "0",

            "0"

        ]

    ],

    "success": true

}

备注:{domainname}https://www.desmart.com.cn:8443

请求之前可以先用Postman等类似的工具测试一下接口是否可以返回正确的数据。

将Body和Headers中的参数设置好,数据成功返回。

本来想在前端访问,但是因为ajax 存在跨越问题,不知道数据如何在前端拿过来,就在后端进行请求获得数据。

我这里用的是httpclent也可以用别的方式只要请求返回正确的数据就好。


import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.protobuf.TextFormat.ParseException;

@Controller
@RequestMapping("stockMarket")
public class stockMarketController {
	
	@RequestMapping(value="getdata")
	@ResponseBody
	public JSONArray resultData() throws ParseException, IOException {
		String body = doPostMethod();
		JSONObject jsonObject = JSONObject.parseObject(body);
		JSONArray jsonArray = jsonObject.getJSONArray("result");
		System.out.println(jsonArray);
		
		JSONArray jsonArray2 = new JSONArray();
		//从数据中截取
		for(int i=0;i<200;i++) {
			//遍历jsonArray数组,把每个对象转成josn对象
			JSONArray jar = jsonArray.getJSONArray(i);
			jsonArray2.add(jar);
		}
		System.out.println("jsonArray2"+jsonArray2);
		
		//对数据进行逆向排序
		JSONArray newJsonArray = new JSONArray();
		for(int i = jsonArray2.size()-1;i>=0;i--) {
			JSONArray jar2 = jsonArray2.getJSONArray(i);
			newJsonArray.add(jar2);
		}
		
		return newJsonArray;
	}
	/**
	 * httpClient post 请求 
	 * @return
	 */
	public String doPostMethod() {
		String url = "https://www.desmart.com.cn:8443/stock/stockInformation/getBussinessLabelPoint";
		String param = "{\"code\":\"sh600000\"}";
                //创建client和post对象
		HttpClient client = HttpClients.createDefault();
		HttpPost post = new HttpPost(url);
		//json形式 headers参数
		post.addHeader("Content-Type", "application/json");
		post.addHeader("headParam","{\"device_no\":\"ios\",\"devcie_name\":\"ios\",\"token\":\"123\",\"phone\":\"15202146557\"}");
		//json字符串以实体的实行放到post中
		//body参数
		post.setEntity(new StringEntity(param,Charset.forName("utf-8")));
		HttpResponse response = null;
		try {
            //获得response对象
			response = client.execute(post);
		} catch (Exception e) {
			e.printStackTrace();
		} 

		if(HttpStatus.SC_OK!=response.getStatusLine().getStatusCode()){
			System.out.println("请求返回不正确");
		}

		String result="";
		try {
           //获得字符串形式的结果
			result = EntityUtils.toString(response.getEntity());
		} catch (Exception e) {
			e.printStackTrace();
		} 
		System.out.println(result);
		return result;
	}
    
    
}

请求返回的数据需要进行处理,使之与EchartsK线图所需要的参数向对应。到这里后台的工作也就完成了,剩下的就交给Echarts。

首先引入Echarts 这个官网有这里就不再赘述。

Echarts K线图demo中的参数

通过观察发现这个数组中的数据似乎并不是都用到了,关键代码如下。

var dates = rawData.map(function (item) {
    return item[0];
});

var data = rawData.map(function (item) {
    return [+item[1], +item[2], +item[5], +item[6]];
});

显而易见 item[0]就是 数据中的date

通过效果图的参数可以定位到open   close   lowest   highest 等关键参数而MA5 MA10 MA20 是通过基于这几个参数计算而来的

明白了这一点 OK 把 获取到的 数据与之对应即可,前端代码:这部分是生成图表的

			function StockMarket(){
			$.ajax({
					url:"stockMarket/getdata",
					async: false,//设置为同步传输
					success:function(result){
					    // 基于准备好的dom,初始化echarts实例
       				 var myChart = echarts.init(document.getElementById('echats'));
					//app.title = '2015 年上证指数';
						//参数 顺序 	日期				open	close						lowest   highest										

					function calculateMA(dayCount, data) {
					    var result = [];
					    for (var i = 0, len = data.length; i < len; i++) {
					        if (i < dayCount) {
					            result.push('-');
					            continue;
					        }
					        var sum = 0;
					        for (var j = 0; j < dayCount; j++) {
					            sum += data[i - j][1];
					        }
					        result.push(sum / dayCount);
					    }
					    return result;
					}

					var dates = result.map(function (item) {
 					    return item[0];
 					});

 					var data = result.map(function (item) {
 						//			open	close    lowest   highest
 					    return [+item[3], +item[2], +item[4], +item[5]];
 						//3245
 					});
					var option = {
							//整体背景色
					    backgroundColor: '#FFFFFF',
					    legend: {
					        data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30'],
					        inactiveColor: '#777',
					        textStyle: {
					            color: '#110000' //头部颜色
					        }
					    },
					    tooltip: {
					        trigger: 'axis',
					        axisPointer: {
					            animation: false,
					            type: 'cross',
					            lineStyle: {
					                color: '#376df4',
					                width: 2,
					                opacity: 1
					            }
					        }
					    },
					    xAxis: {
					        type: 'category',
					        data: dates,
					        axisLine: { lineStyle: { color: '#8392A5' } }
					    },
					    yAxis: {
					        scale: true,
					        axisLine: { lineStyle: { color: '#8392A5' } },
					        splitLine: { show: false }
					    },
					    grid: {
					        bottom: 80
					    },
					    dataZoom: [{
					        textStyle: {
					            color: '#8392A5'
					        },
					        handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
					        handleSize: '80%',
					        dataBackground: {
					            areaStyle: {
					                color: '#8392A5'
					            },
					            lineStyle: {
					                opacity: 0.8,
					                color: '#8392A5'
					            }
					        },
					        handleStyle: {
					            color: '#fff',
					            shadowBlur: 3,
					            shadowColor: 'rgba(0, 0, 0, 0.6)',
					            shadowOffsetX: 2,
					            shadowOffsetY: 2
					        }
					    }, {
					        type: 'inside'
					    }],
					    animation: false,
					    series: [
					        {
					            type: 'candlestick',
					            name: '日K',
					            data: data,
					            itemStyle: {
					                normal: {
					                    color: '#FD1050',
					                    color0: '#0CF49B',
					                    borderColor: '#FD1050',
					                    borderColor0: '#110000'
					                }
					            }
					        },
					        {
					            name: 'MA5',
					            type: 'line',
					            data: calculateMA(5, data),
					            smooth: true,
					            showSymbol: false,
					            lineStyle: {
					                normal: {
					                    width: 1
					                }
					            }
					        },
					        {
					            name: 'MA10',
					            type: 'line',
					            data: calculateMA(10, data),
					            smooth: true,
					            showSymbol: false,
					            lineStyle: {
					                normal: {
					                    width: 1
					                }
					            }
					        },
					        {
					            name: 'MA20',
					            type: 'line',
					            data: calculateMA(20, data),
					            smooth: true,
					            showSymbol: false,
					            lineStyle: {
					                normal: {
					                    width: 1
					                }
					            }
					        },
					        {
					            name: 'MA30',
					            type: 'line',
					            data: calculateMA(30, data),
					            smooth: true,
					            showSymbol: false,
					            lineStyle: {
					                normal: {
					                    width: 1
					                }
					            }
					        }
					    ]
					};
					myChart.setOption(option);
					
					}//success结束		
				})
}

 var myChart = echarts.init(document.getElementById('echats'));

这段代码的作用就是把图表渲染到指定位置写一个div 对应好id 即可。

<div id="echats"class="content"><!-- 行情图展示位置 --></div>

OK,这样就大功告成了,Echarts真的好用。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值