Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "open System\n",
- "open System.Collections.Generic"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "module PriceMovingAverage =\n",
- "\n",
- " type PriceRecord =\n",
- " {\n",
- " Timestamp : DateTime\n",
- " Price: float\n",
- " }\n",
- "\n",
- " // queue duration\n",
- " let queueDuration = TimeSpan.FromHours(1.)\n",
- "\n",
- " // moving average queue\n",
- " let private priceQueue = Queue<PriceRecord>()\n",
- "\n",
- " // update moving average\n",
- " let updateMovingAverage timestamp price =\n",
- "\n",
- " // add the new price\n",
- " priceQueue.Enqueue({ Timestamp = timestamp; Price = price})\n",
- "\n",
- " // remove the items older than the price base period\n",
- " let rec dequeueLoop () =\n",
- " let p = priceQueue.Peek()\n",
- " if p.Timestamp + queueDuration < timestamp then\n",
- " priceQueue.Dequeue() |> ignore\n",
- " dequeueLoop()\n",
- "\n",
- " dequeueLoop()\n",
- "\n",
- "\n",
- " // get the moving average\n",
- " let getPrice fromTimestamp =\n",
- " try\n",
- " Some (\n",
- " priceQueue\n",
- " |> Seq.toList\n",
- " |> List.skipWhile (fun t -> t.Timestamp < fromTimestamp)\n",
- " |> List.averageBy (fun t -> t.Price)\n",
- " |> decimal\n",
- " )\n",
- " with _ ->\n",
- " None\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "add some data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "let mutable price = 100.\n",
- "let mutable date = DateTime(2020, 10, 1)\n",
- "let r = Random()\n",
- "\n",
- "for i in 0..20000 do\n",
- " PriceMovingAverage.updateMovingAverage date price\n",
- "\n",
- " price <- price + 0.5 - r.NextDouble()\n",
- " date <- date.AddSeconds(10. * r.NextDouble())\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "get the data back"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Some 93.5840892957842M"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "let dateFrom = DateTime(2020, 10, 1, 1, 0, 0)\n",
- "PriceMovingAverage.getPrice dateFrom"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "F#",
- "language": "fsharp",
- "name": "ifsharp"
- },
- "language": "fsharp",
- "language_info": {
- "codemirror_mode": "",
- "file_extension": ".fs",
- "mimetype": "text/x-fsharp",
- "name": "fsharp",
- "nbconvert_exporter": "",
- "pygments_lexer": "",
- "version": "4.3.1.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement