168 lines
4.2 KiB
HTML
168 lines
4.2 KiB
HTML
<!DOCTYPE html>
|
||
<meta charset="utf-8">
|
||
<style>
|
||
|
||
body {
|
||
font: 10px sans-serif;
|
||
}
|
||
|
||
text {
|
||
fill: #000;
|
||
}
|
||
|
||
button {
|
||
position: absolute;
|
||
right: 20px;
|
||
top: 440px;
|
||
display: none;
|
||
}
|
||
|
||
path.candle {
|
||
stroke: #000000;
|
||
}
|
||
|
||
path.candle.body {
|
||
stroke-width: 0;
|
||
}
|
||
|
||
path.candle.up {
|
||
fill: #dc3526;
|
||
stroke: #dc3526;
|
||
}
|
||
|
||
path.candle.down {
|
||
fill: #007d30;
|
||
stroke: #007d30;
|
||
}
|
||
|
||
</style>
|
||
<body>
|
||
<h3 id="chart-title"></h3>
|
||
<div>
|
||
<input type="radio" name="range" value="5d">5日<br>
|
||
<input type="radio" name="range" value="30d">30日<br>
|
||
<input type="radio" name="range" value="ytd">今年迄今<br>
|
||
</div>
|
||
|
||
<script src="http://d3js.org/d3.v4.min.js"></script>
|
||
<script src="http://techanjs.org/techan.min.js"></script>
|
||
<script>
|
||
|
||
var margin = {top: 20, right: 20, bottom: 30, left: 50},
|
||
width = 960 - margin.left - margin.right,
|
||
height = 500 - margin.top - margin.bottom;
|
||
|
||
var parseDate = d3.timeParse("%d-%b-%y");
|
||
|
||
var x = techan.scale.financetime()
|
||
.range([0, width]);
|
||
|
||
var y = d3.scaleLinear()
|
||
.range([height, 0]);
|
||
|
||
var candlestick = techan.plot.candlestick()
|
||
.xScale(x)
|
||
.yScale(y);
|
||
|
||
var xAxis = d3.axisBottom()
|
||
.scale(x)
|
||
.tickFormat(d3.timeFormat('%y-%m-%d'));
|
||
|
||
var yAxis = d3.axisLeft()
|
||
.scale(y);
|
||
|
||
var svg = d3.select("body").append("svg")
|
||
.attr("width", width + margin.left + margin.right)
|
||
.attr("height", height + margin.top + margin.bottom)
|
||
.append("g")
|
||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||
|
||
|
||
var data_by_date = [];
|
||
|
||
|
||
|
||
d3.json(`https://gist.githubusercontent.com/Yoxem/e3e1986777af209a00f8a318056431ed/raw/b646e322a87e2bc2c061ecf32902fc543bc41aed/0050.json`, function(d) {
|
||
console.log(d);
|
||
|
||
var data_by_date = [];
|
||
var parseDate = d3.timeParse("%Y-%m-%d");
|
||
|
||
|
||
for (var i=0;i<d["close"].length;i++){
|
||
data_by_date.push({
|
||
date: parseDate(d["date"][i]),
|
||
open: +d["open"][i],
|
||
high: +d["high"][i],
|
||
low: +d["low"][i],
|
||
close: +d["close"][i],
|
||
volume: +d["volume"][i],
|
||
});};
|
||
|
||
console.log('dataGet', data_by_date);
|
||
|
||
var accessor = candlestick.accessor();
|
||
data_by_date = data_by_date.sort(function(a, b) { return d3.ascending(accessor.d(a), accessor.d(b)); });
|
||
|
||
console.log("===" + JSON.stringify(data_by_date));
|
||
|
||
svg.append("g")
|
||
.attr("class", "candlestick");
|
||
|
||
|
||
|
||
svg.append("g")
|
||
.attr("class", "x axis")
|
||
.attr("transform", "translate(0," + height + ")")
|
||
.append("text")
|
||
.text("日期")
|
||
.attr("transform", "translate(" + width + ", 0)");
|
||
|
||
|
||
|
||
svg.append("g")
|
||
.attr("class", "y axis")
|
||
.append("text")
|
||
.attr("transform", "rotate(-90)")
|
||
.attr("y", 6)
|
||
.attr("dy", ".71em")
|
||
.style("text-anchor", "end")
|
||
.text("股價(NT$)");
|
||
|
||
// Data to display initially
|
||
d3.select("#chart-title").text("今年迄今");
|
||
draw(data_by_date);
|
||
// Only want this button to be active if the data has loaded
|
||
// d3.select("input").on("click", function() { draw(data_by_date); }).style("display", "inline");
|
||
|
||
d3.selectAll('input[name="range"]').on("change", function(){
|
||
if (this.value == "ytd"){
|
||
draw(data_by_date);
|
||
d3.select("#chart-title").text("今年迄今");
|
||
}
|
||
else if(this.value == "30d"){
|
||
draw(data_by_date.slice(data_by_date.length-30, data_by_date.length-1));
|
||
d3.select("#chart-title").text("30日");
|
||
}
|
||
else{
|
||
draw(data_by_date.slice(data_by_date.length-5, data_by_date.length-1));
|
||
d3.select("#chart-title").text("5日");
|
||
};
|
||
});
|
||
|
||
|
||
} ); // 串接網址
|
||
|
||
|
||
|
||
function draw(data) {
|
||
x.domain(data.map(candlestick.accessor().d));
|
||
y.domain(techan.scale.plot.ohlc(data, candlestick.accessor()).domain());
|
||
|
||
svg.selectAll("g.candlestick").datum(data).call(candlestick);
|
||
svg.selectAll("g.x.axis").call(xAxis);
|
||
svg.selectAll("g.y.axis").call(yAxis);
|
||
}
|
||
|
||
</script>
|
||
|