Определите, находится ли значение между двумя ценами или оно действительно развивается

1

Я сделал персональный webtool, который собирает данные о изменениях цен в графике plotly. Цены подаются в мой скрипт через websocket каждые 20 секунд. На данный момент каждое изменение цены создаст новую точку на графике. Это прекрасно работает!

Проблема. Большинство предметов получают фактическое обновление цены каждые 1-2 часа, но некоторые, кажется, дрожат на несколько центов. Это означает, что предмет может идти от 1.50 € до 1.51 € и обратно каждые 20 секунд в течение нескольких часов, создавая бесконечные графы. Данные из websocket всегда будут содержать полный прейскурант на несколько сотен штук, даже если их цены не изменились.

Мой подход к этому, похоже, работает частично. Я сохраняю последние две известные цены в коротком массиве с каждым элементом. Если цена изменится, она будет проверять, если последние две изменения включали эту новую цену, если да: Нет новой точки, просто обновите старую. Если новая цена не включена в массив "черного списка" (так что это "реальное" изменение цены), создайте новую точку и соответствующим образом обновите черный список. Проблема в том, что если элемент снова начинает дрожать после "реального" обновления, он будет генерировать крошечный всплеск с дополнительной точкой.

Есть ли более разумный способ сделать это без ошибок?

var db = { // Example object in my database
    apple: {currentPrice: 1.44, graphX: [1.42, 1.41, 1.44], graphY: [1534175049283, 1534175019374, 1534175082191], blackList = [1.44, 1.41]}
}

function newPrice(name, price){
    if(db[name].currentPrice != price){ // Check if the price changed at all
        if(db[name].blackList.indexOf(.price) == -1){ // Check if the price has been seen within the last 2 changes, if not, treat it as a new price
            db[name].graphX.push(price); // Add price...
            db[name].graphY.push(Date.now()); // ...and timestamp to X and Y arrays for a plotly graph to read when requested
            db[name].currentPrice = price; // Update the current price (for easier access)
            db[name].blackList[1] = db[name].blackList[0]; // Move the blacklist array by one up, delete the oldest one
            db[name].blackList[0] = price; // set the new price to [0] on the blacklist
            console.log("New graph point created!")
        } else { // If it one of the recent prices, dont add a new graph point, just update the old one 
            db[name].currentPrice = price; // Update the current price (for easier access)
            db[name].graphX[db[name].graphX.length - 1] = price; // update the last array segment (price)
            db[name].graphY[db[name].graphY.length - 1] = Date.now(); // update the last array segment (time)
            console.log("Jittering price, updated last graph point!");
        }
    }
}

newPrice("apple", 1.41) // Gets called by a websocket every ~30 seconds, providing a name and a price
  • 0
    Если вы не скажете что-то вроде изменений в пределах определенного% или значения тока, игнорируются, то нет, вы не можете этого сделать. В случае, если вы упомянули о дрожании после реального обновления - если ни одна из «цен на дрожание» не находится в черном списке, то они оба действительны и должны отображаться.
Теги:
database

2 ответа

0

Если фактическая цена не обновляется, за исключением каждого часа или около того, почему бы не запустить ее каждый час, а не каждые 20 секунд или около того? Подумайте о том, как запустить скрипт с заданным интервалом.

См.: Запуск сценария node.js каждые 10 секунд и редактирование в соответствии с вашими потребностями.

0

Вы можете добавить ограничение допуска изменения, позвоните ему L. Если | newValue - oldValue | <= L, то вы считаете, что изменение слишком незначительное и игнорирует его. Кроме того, вам понадобится максимальный неизменный предел, называемый MU, поэтому, если бы существовали значения MU со времени последнего невыполненного изменения, тогда вы все равно планируете новое изменение. Это сделало бы граф более стабильным и более легким для изучения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню