
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/facePrint.js"></script>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
            }
        </style>
        <div id="info"></div>
        <div id="main"></div>
        <script>

            /**
             * @see <https://en.wikipedia.org/wiki/Michelson%E2%80%93Morley_experiment>
             * @see <http://bl.ocks.org/mbostock/4061502>
             */
            var chart;
            var data;

            require([
                'echarts',
                'data/security-sh-2013.json.js'
            ], function (echarts, rawData) {

                chart = echarts.init(document.getElementById('main'), null, {

                });

                option = {
                    title: {
                        text: "十字星颜色测试，期望值：红、红、红、绿、红、红、红、绿"
                    },
                    "xAxis": [{
                        "type": "category",
                        "data": ["2017-08-22", "2017-08-23", "2017-08-24", "2017-08-25", "2017-08-28", "2017-08-29", "2017-08-30", "2017-08-31"],
                        "scale": true,
                        "boundaryGap": false,
                        "axisLine": {
                            "onZero": false,
                            "lineStyle": {
                                "color": "#f1f1f1"
                            }
                        },
                        "axisTick": {
                            "show": false
                        },
                        "axisLabel": {
                            "show": false
                        },
                        "axisPointer": {
                            "z": 100
                        }
                    }],
                    "yAxis": [{
                    }],
                    "series": [{
                        "name": "stock",
                        "type": "candlestick",
                        "data": [
                            [20, 20, 17, 29],
                            [22.68, 22.68, 22.68, 22.68],
                            [24.95, 24.95, 20, 28],
                            [20, 20, 18, 24],
                            [35, 35, 35, 40],
                            [36.54, 36.54, 30, 36.54],
                            [40, 45, 38, 45],
                            [32, 28, 27, 33]
                        ],
                        "itemStyle": {
                            "normal": {
                                "color": "#fa6464",
                                "color0": "#32C896",
                                "borderColor": "#fa6464",
                                "borderColor0": "#32C896"
                            }
                        },
                        "markPoint": {
                            "label": {
                                "normal": {}
                            },
                            "data": []
                        }
                    }]
                };
                chart.setOption(option);
            });
        </script>
    </body>
</html>