Как нарисовать линию на графике старшего чарта из звонка AJAX? - PullRequest
1 голос
/ 17 апреля 2020

На моей странице html есть график высоких диаграмм, который я хочу динамически обновлять. У меня есть несколько полей ввода, которые, как только они обновляются пользователем, вызывают AJAX пост-запрос. Запрос выполняет некоторые вычисления, и я хочу, чтобы выходные данные использовались для перерисовки линии второго ser моего графика ie. Эта строка представляет простую функцию y = x, переменная x вычисляется во время вызова AJAX.

Вот мой html / JS код для диаграммы:

<script type="text/javascript">

    $(function () {
    $(document).ready(function () {
        Highcharts.setOptions({
            global: {
                useUTC: false
            }
        });

        var chart;
        $('#container').highcharts({
            chart: {
                type: 'line',
                animation: Highcharts.svg,
                marginRight: 10,
            },
            title: {
                text: 'Strategy Payoff'
            },
            xAxis: {
                //type: 'datetime',
                tickPixelInterval: 150
            },
            yAxis: {
                title: {
                    text: 'Value'
                },
                plotLines: [{
                    value: 0,
                    width: 1,
                    color: '#808080'
                }]
            },

            legend: {
                enabled: false
            },
            exporting: {
                enabled: false
            },
            series: [{
                name: 'PnL',
                data: (function () {
                    var data = [],
                        time = (new Date()).getTime(),
                        i;
                    var V = document.getElementById('V').value;
                    var Q = document.getElementById('Q').value;
                    var S = document.getElementById('S').value;
                    var K = document.getElementById('K').value;
                    var Type = document.getElementById('Type').value;

                    if (Type == 'Call') {
                      direction = 1;
                    } else {
                      direction = -1;
                    }

                    if (S >= 5000) {
                      stepSize = 500;
                    } else if (S >= 500) {
                      stepSize = 50;
                    } else {
                      stepSize = 1;
                    }

                    for (i = 0; i <= S * 2; i+=stepSize) { // i+=stepSize
                        data.push({
                            x: i,
                            y: Math.max(-V * Q, -V * Q + Q * direction * (i-K))
                        });
                    }
                    return data;
                })()
            }, {
                name: 'Current Option Strategy PnL',
                data: (function pnl(value=10) {
                      var data2 = [],
                          time2 = (new Date()).getTime(),
                          i;
                      var S = document.getElementById('S').value;

                      if (S >= 5000) {
                      stepSize = 500;
                      } else if (S >= 500) {
                      stepSize = 50;
                      } else {
                      stepSize = 1;
                      }

                      for (i = 0; i <= S * 2; i+=stepSize) {
                        data2.push({
                            x: i,
                            y: value
                        });
                      }

                    return data2;
                })()
            }]
        });
    });

});

  </script>

Вот поля ввода, которые запускают запрос AJAX при обновлении пользователем:

 <div class="chart" id="container"></div>

 <div class="slider-wrapper">
    <span>Option 1 Imp. Vol.</span>
    <input class="toChange" id="rangeInput" name="rangeInput" type="range" value="{{Sigma}}" min="0.1" max="150" lang="en_EN" step="0.1" oninput="amount.value=rangeInput.value" />
    <input class="toChange" id="amount" type="number" value="{{Sigma}}" min="0.1" max="150" lang="en_EN" step="0.1"oninput="rangeInput.value=amount.value" />
  </div>

Наконец, вот запрос AJAX:

 <script type="text/javascript">
   function inputChange () {
        var Sigma = document.getElementById("rangeInput").value;
        var Type = document.getElementById('Type').value;
        var S = document.getElementById('S').value;
        var K = document.getElementById('K').value;
        var t = document.getElementById('t').value;
        var r = document.getElementById('r').value;
        var V = document.getElementById('V').value;
        var Q = document.getElementById('Q').value;
        $.ajax({
                url: '/optionstrategies/',
                type: 'POST',
                data: {
                  'Type': Type,
                  'S': S,
                  'K': K,
                  'r': r,
                  't': t,
                  'Sigma': Sigma,
                },
                success: function(optionVal) {
                alert((optionVal - V) * Q);
                document.getElementById("oPrice").innerHTML = optionVal;
                document.getElementById("PnL").innerHTML = (optionVal - V) * Q;
                // pnl(12);
                }
        }); 
    }

    $(".toChange").change(inputChange); 
 </script>

Вызов AJAX работает хорошо, так как предупреждение показывает ожидаемое значение. Теперь мне нужно использовать это значение для обновления моего графика. Так, например, если значение равно 12, мне нужно второе ser ie моего графика, чтобы нарисовать линию, представляющую функцию y = 12. Как вы видите, я назвал функцию, связанную с моим вторым ser ie 'pnl'. Я пытался вызвать эту функцию в части «success» моего AJAX запроса, написав что-то вроде «pnl (12);», но ничего не получилось. Кто-нибудь может помочь, пожалуйста?

1 Ответ

1 голос
/ 17 апреля 2020

Используйте функцию series.update внутри успешного вызова и установите для него новые данные. Пожалуйста, проверьте доступные демонстрации по ссылке ниже.

API: https://api.highcharts.com/class-reference/Highcharts.Series#update

Если эта подсказка не поможет, пожалуйста, воспроизведите упрощенную версию своего кода на некоторых онлайн-редактор, над которым я мог бы работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...