diff --git a/algo.ipynb b/algo.ipynb
index 42d9f46..1b8d590 100644
--- a/algo.ipynb
+++ b/algo.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 76,
+ "execution_count": 8,
"id": "d1eed397",
"metadata": {},
"outputs": [],
@@ -18,7 +18,7 @@
},
{
"cell_type": "code",
- "execution_count": 77,
+ "execution_count": 9,
"id": "c6151613",
"metadata": {},
"outputs": [],
@@ -38,21 +38,22 @@
"1"
]
},
- "execution_count": 131,
+ "execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"config_update = {\n",
- " 'Min_Time_To_Funding_Minutes': 7,\n",
- " # 'Allow_Ordering_Aster': True,\n",
- " # 'Allow_Ordering_Extend': True,\n",
+ " # 'Min_Time_To_Funding_Minutes': 60,\n",
+ " # 'Allow_Ordering_Aster': False,\n",
+ " # 'Allow_Ordering_Extend': False,\n",
" 'Loop_Sleep_Sec': 0.00,\n",
- "# 'Flip_Side_For_Testing': False,\n",
+ " 'Min_Fund_Rate_Pct_To_Trade': 0.0001,\n",
+ " # 'Flip_Side_For_Testing': False,\n",
"# 'Price_Worsener_Extend': 0.0,\n",
- " 'Log_Summary_Each_Loop': False,\n",
- " 'Print_Summary_Each_Loop': False,\n",
+ " # 'Log_Summary_Each_Loop': False,\n",
+ " # 'Print_Summary_Each_Loop': False,\n",
"}\n",
"VAL_KEY.publish('fr_orchestrator_input', json.dumps(config_update))"
]
diff --git a/algo_config.json b/algo_config.json
index e712764..eeb886e 100644
--- a/algo_config.json
+++ b/algo_config.json
@@ -1,14 +1,16 @@
{
- "Config_Updated_Timestamp": 1777312620005,
+ "Config_Updated_Timestamp": 1777388081818,
"Allow_Ordering_Aster": true,
"Allow_Ordering_Extend": true,
"Loop_Sleep_Sec": 0.0,
"Max_Target_Notional": 0.0,
- "Min_Time_To_Funding_Minutes": 7,
- "Price_Worsener_Aster": 0.0,
- "Price_Worsener_Extend": 0.0,
+ "Min_Time_To_Funding_Minutes": 60,
+ "Min_Fund_Rate_Pct_To_Trade": 0.000,
+ "Price_Worsener_Aster": 0.01,
+ "Price_Worsener_Extend": -0.1,
"Target_Open_Cash_Position": 10,
"Log_Summary_Each_Loop": false,
- "Print_Summary_Each_Loop": false,
+ "Print_Summary_Each_Loop": true,
+ "Flatten_Open_Positions": true,
"Flip_Side_For_Testing": false
}
\ No newline at end of file
diff --git a/aster.ipynb b/aster.ipynb
index 1a60523..6734392 100644
--- a/aster.ipynb
+++ b/aster.ipynb
@@ -594,7 +594,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.13.12"
+ "version": "3.13.13"
}
},
"nbformat": 4,
diff --git a/engine_dispersion.ipynb b/engine_dispersion.ipynb
new file mode 100644
index 0000000..42a2926
--- /dev/null
+++ b/engine_dispersion.ipynb
@@ -0,0 +1,5701 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 183,
+ "id": "25697582",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from pprint import pprint\n",
+ "from sqlalchemy import create_engine, text\n",
+ "import plotly.express as px\n",
+ "import requests\n",
+ "import json\n",
+ "import time\n",
+ "from datetime import datetime\n",
+ "import plotly.graph_objects as go\n",
+ "from plotly.subplots import make_subplots\n",
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "id": "cd9ecfde",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Connection successful\n"
+ ]
+ }
+ ],
+ "source": [
+ "### MYSQL ###\n",
+ "ENGINE = create_engine('mysql+pymysql://root:pwd@localhost/fund_rate')\n",
+ "try:\n",
+ " with ENGINE.connect() as conn:\n",
+ " print(\"Connection successful\")\n",
+ "except Exception as e:\n",
+ " print(f\"Connection failed: {e}\") "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "id": "60cc2366",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def funding_rate_hist_extend(market: str, startTime: int | None = None, endTime: int | None = None ):\n",
+ " if startTime is None:\n",
+ " startTime = int(round(datetime.now().timestamp() * 1000)) - int(1000 * 60 * 60 * 24 * 30)\n",
+ " if endTime is None:\n",
+ " endTime = int(round(datetime.now().timestamp() * 1000))\n",
+ " \n",
+ " r = requests.get(f\"https://api.starknet.extended.exchange/api/v1/info/{market}/funding?startTime={startTime}&endTime={endTime}\")\n",
+ " return json.loads(r.text)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 186,
+ "id": "55ae5271",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def ratio_trades_to_midbars(df: pd.DataFrame, ts_col: str, is_buyer_maker_col: str, price_col: str = 'price', qty_col: str = 'qty', freq: str ='s') -> tuple[pd.DataFrame, pd.DataFrame]:\n",
+ " df_maker = df.loc[df[is_buyer_maker_col]==1, :].groupby(pd.Grouper(key=ts_col, freq=freq)).agg({'price':['min','median','max'], 'qty':'sum'}) # Resting on the bid (buyer is maker): ASK [Taker] [Seller] -- Crossed into --> BID [Maker] [Buyer]\n",
+ " df_taker = df.loc[df[is_buyer_maker_col]==0, :].groupby(pd.Grouper(key=ts_col, freq=freq)).agg({'price':['min','median','max'], 'qty':'sum'}) # Resting on the ask (seller is maker): BID [Taker] [Buyer] -- Crossed into --> ASK [Maker] [Seller]\n",
+ " df_maker.columns = ['_'.join(col).strip() for col in df_maker.columns.to_flat_index()]\n",
+ " df_taker.columns = ['_'.join(col).strip() for col in df_taker.columns.to_flat_index()]\n",
+ " \n",
+ " return df_maker, df_taker"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 187,
+ "id": "2b7232e5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_24hrs_midbars(table_name: str, freq='min', ts_col='timestamp_trade', is_buyer_maker_col='is_buyer_mkt_maker'):\n",
+ " df = pd.read_sql(\n",
+ " text(f'''\n",
+ " SELECT *\n",
+ " FROM {table_name}\n",
+ " '''),\n",
+ " con=ENGINE\n",
+ " )\n",
+ " df['timestamp_trade_dt'] = pd.to_datetime(df[ts_col], unit='ms')\n",
+ "\n",
+ " df_maker, df_taker = ratio_trades_to_midbars(\n",
+ " df=df,\n",
+ " freq=freq,\n",
+ " ts_col='timestamp_trade_dt',\n",
+ " is_buyer_maker_col=is_buyer_maker_col\n",
+ " )\n",
+ "\n",
+ " return df_maker.dropna(), df_taker.dropna()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 188,
+ "id": "f1174bae",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_fr = funding_rate_hist_extend(market='ETH-USD')\n",
+ "df_fr = pd.DataFrame(df_fr['data']).rename({'m':'market','f':'funding_rate','T':'timestamp'}, axis=1)\n",
+ "df_fr['timestamp_dt'] = pd.to_datetime(df_fr['timestamp'], unit='ms')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 189,
+ "id": "068a54b6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_aster_trades_by_sec_maker, df_aster_trades_by_sec_taker = get_24hrs_midbars(\n",
+ " table_name='fr_aster_mkt_trades',\n",
+ ")\n",
+ "\n",
+ "df_extend_trades_by_sec_maker, df_extend_trades_by_sec_taker = get_24hrs_midbars(\n",
+ " table_name='fr_extended_mkt_trades',\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 190,
+ "id": "2862e7e3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "hovertemplate": "timestamp_trade_dt=%{x}
qty_sum=%{y}",
+ "legendgroup": "",
+ "line": {
+ "color": "#636efa",
+ "dash": "solid"
+ },
+ "marker": {
+ "symbol": "circle"
+ },
+ "mode": "lines",
+ "name": "",
+ "orientation": "v",
+ "showlegend": false,
+ "type": "scatter",
+ "x": [
+ "2026-04-27T15:18:00",
+ "2026-04-27T15:19:00",
+ "2026-04-27T15:20:00",
+ "2026-04-27T15:21:00",
+ "2026-04-27T15:22:00",
+ "2026-04-27T15:23:00",
+ "2026-04-27T15:24:00",
+ "2026-04-27T15:25:00",
+ "2026-04-27T15:26:00",
+ "2026-04-27T15:27:00",
+ "2026-04-27T15:28:00",
+ "2026-04-27T15:29:00",
+ "2026-04-27T15:30:00",
+ "2026-04-27T15:31:00",
+ "2026-04-27T15:32:00",
+ "2026-04-27T15:33:00",
+ "2026-04-27T15:34:00",
+ "2026-04-27T15:35:00",
+ "2026-04-27T15:36:00",
+ "2026-04-27T15:37:00",
+ "2026-04-27T15:38:00",
+ "2026-04-27T15:39:00",
+ "2026-04-27T15:40:00",
+ "2026-04-27T15:41:00",
+ "2026-04-27T15:42:00",
+ "2026-04-27T15:43:00",
+ "2026-04-27T15:44:00",
+ "2026-04-27T15:45:00",
+ "2026-04-27T15:46:00",
+ "2026-04-27T15:47:00",
+ "2026-04-27T15:48:00",
+ "2026-04-27T15:49:00",
+ "2026-04-27T15:50:00",
+ "2026-04-27T15:51:00",
+ "2026-04-27T15:52:00",
+ "2026-04-27T15:53:00",
+ "2026-04-27T15:54:00",
+ "2026-04-27T15:55:00",
+ "2026-04-27T15:56:00",
+ "2026-04-27T15:57:00",
+ "2026-04-27T15:58:00",
+ "2026-04-27T15:59:00",
+ "2026-04-27T16:00:00",
+ "2026-04-27T16:01:00",
+ "2026-04-27T16:02:00",
+ "2026-04-27T16:03:00",
+ "2026-04-27T16:04:00",
+ "2026-04-27T16:05:00",
+ "2026-04-27T16:06:00",
+ "2026-04-27T16:07:00",
+ "2026-04-27T16:08:00",
+ "2026-04-27T16:09:00",
+ "2026-04-27T16:10:00",
+ "2026-04-27T16:11:00",
+ "2026-04-27T16:12:00",
+ "2026-04-27T16:13:00",
+ "2026-04-27T16:14:00",
+ "2026-04-27T16:15:00",
+ "2026-04-27T16:16:00",
+ "2026-04-27T16:17:00",
+ "2026-04-27T16:18:00",
+ "2026-04-27T16:19:00",
+ "2026-04-27T16:20:00",
+ "2026-04-27T16:21:00",
+ "2026-04-27T16:22:00",
+ "2026-04-27T16:23:00",
+ "2026-04-27T16:24:00",
+ "2026-04-27T16:25:00",
+ "2026-04-27T16:26:00",
+ "2026-04-27T16:27:00",
+ "2026-04-27T16:28:00",
+ "2026-04-27T16:29:00",
+ "2026-04-27T16:30:00",
+ "2026-04-27T16:31:00",
+ "2026-04-27T16:32:00",
+ "2026-04-27T16:33:00",
+ "2026-04-27T16:34:00",
+ "2026-04-27T16:35:00",
+ "2026-04-27T16:36:00",
+ "2026-04-27T16:37:00",
+ "2026-04-27T16:38:00",
+ "2026-04-27T16:39:00",
+ "2026-04-27T16:40:00",
+ "2026-04-27T16:41:00",
+ "2026-04-27T16:42:00",
+ "2026-04-27T16:43:00",
+ "2026-04-27T16:44:00",
+ "2026-04-27T16:45:00",
+ "2026-04-27T16:46:00",
+ "2026-04-27T16:47:00",
+ "2026-04-27T16:48:00",
+ "2026-04-27T16:49:00",
+ "2026-04-27T16:50:00",
+ "2026-04-27T16:51:00",
+ "2026-04-27T16:52:00",
+ "2026-04-27T16:53:00",
+ "2026-04-27T16:54:00",
+ "2026-04-27T16:55:00",
+ "2026-04-27T16:56:00",
+ "2026-04-27T16:57:00",
+ "2026-04-27T16:58:00",
+ "2026-04-27T16:59:00",
+ "2026-04-27T17:00:00",
+ "2026-04-27T17:01:00",
+ "2026-04-27T17:02:00",
+ "2026-04-27T17:03:00",
+ "2026-04-27T17:04:00",
+ "2026-04-27T17:05:00",
+ "2026-04-27T17:06:00",
+ "2026-04-27T17:07:00",
+ "2026-04-27T17:08:00",
+ "2026-04-27T17:09:00",
+ "2026-04-27T17:10:00",
+ "2026-04-27T17:11:00",
+ "2026-04-27T17:12:00",
+ "2026-04-27T17:13:00",
+ "2026-04-27T17:14:00",
+ "2026-04-27T17:15:00",
+ "2026-04-27T17:16:00",
+ "2026-04-27T17:17:00",
+ "2026-04-27T17:18:00",
+ "2026-04-27T17:19:00",
+ "2026-04-27T17:20:00",
+ "2026-04-27T17:21:00",
+ "2026-04-27T17:22:00",
+ "2026-04-27T17:23:00",
+ "2026-04-27T17:24:00",
+ "2026-04-27T17:25:00",
+ "2026-04-27T17:26:00",
+ "2026-04-27T17:27:00",
+ "2026-04-27T17:28:00",
+ "2026-04-27T17:29:00",
+ "2026-04-27T17:30:00",
+ "2026-04-27T17:31:00",
+ "2026-04-27T17:32:00",
+ "2026-04-27T17:33:00",
+ "2026-04-27T17:34:00",
+ "2026-04-27T17:35:00",
+ "2026-04-27T17:36:00",
+ "2026-04-27T17:37:00",
+ "2026-04-27T17:38:00",
+ "2026-04-27T17:39:00",
+ "2026-04-27T17:40:00",
+ "2026-04-27T17:41:00",
+ "2026-04-27T17:42:00",
+ "2026-04-27T17:43:00",
+ "2026-04-27T17:44:00",
+ "2026-04-27T17:45:00",
+ "2026-04-27T17:46:00",
+ "2026-04-27T17:47:00",
+ "2026-04-27T17:48:00",
+ "2026-04-27T17:49:00",
+ "2026-04-27T17:50:00",
+ "2026-04-27T17:51:00",
+ "2026-04-27T17:52:00",
+ "2026-04-27T17:53:00",
+ "2026-04-27T17:54:00",
+ "2026-04-27T17:55:00",
+ "2026-04-27T17:56:00",
+ "2026-04-27T17:57:00",
+ "2026-04-27T17:58:00",
+ "2026-04-27T17:59:00",
+ "2026-04-27T18:00:00",
+ "2026-04-27T18:01:00",
+ "2026-04-27T18:02:00",
+ "2026-04-27T18:03:00",
+ "2026-04-27T18:04:00",
+ "2026-04-27T18:05:00",
+ "2026-04-27T18:06:00",
+ "2026-04-27T18:07:00",
+ "2026-04-27T18:08:00",
+ "2026-04-27T18:09:00",
+ "2026-04-27T18:10:00",
+ "2026-04-27T18:11:00",
+ "2026-04-27T18:12:00",
+ "2026-04-27T18:13:00",
+ "2026-04-27T18:14:00",
+ "2026-04-27T18:15:00",
+ "2026-04-27T18:16:00",
+ "2026-04-27T18:17:00",
+ "2026-04-27T18:18:00",
+ "2026-04-27T18:19:00",
+ "2026-04-27T18:20:00",
+ "2026-04-27T18:21:00",
+ "2026-04-27T18:22:00",
+ "2026-04-27T18:23:00",
+ "2026-04-27T18:24:00",
+ "2026-04-27T18:25:00",
+ "2026-04-27T18:26:00",
+ "2026-04-27T18:27:00",
+ "2026-04-27T18:28:00",
+ "2026-04-27T18:29:00",
+ "2026-04-27T18:30:00",
+ "2026-04-27T18:31:00",
+ "2026-04-27T18:32:00",
+ "2026-04-27T18:33:00",
+ "2026-04-27T18:34:00",
+ "2026-04-27T18:35:00",
+ "2026-04-27T18:36:00",
+ "2026-04-27T18:37:00",
+ "2026-04-27T18:38:00",
+ "2026-04-27T18:39:00",
+ "2026-04-27T18:40:00",
+ "2026-04-27T18:41:00",
+ "2026-04-27T18:42:00",
+ "2026-04-27T18:43:00",
+ "2026-04-27T18:44:00",
+ "2026-04-27T18:45:00",
+ "2026-04-27T18:46:00",
+ "2026-04-27T18:47:00",
+ "2026-04-27T18:48:00",
+ "2026-04-27T18:49:00",
+ "2026-04-27T18:50:00",
+ "2026-04-27T18:51:00",
+ "2026-04-27T18:52:00",
+ "2026-04-27T18:53:00",
+ "2026-04-27T18:54:00",
+ "2026-04-27T18:55:00",
+ "2026-04-27T18:56:00",
+ "2026-04-27T18:57:00",
+ "2026-04-27T18:58:00",
+ "2026-04-27T18:59:00",
+ "2026-04-27T19:00:00",
+ "2026-04-27T19:01:00",
+ "2026-04-27T19:02:00",
+ "2026-04-27T19:03:00",
+ "2026-04-27T19:04:00",
+ "2026-04-27T19:05:00",
+ "2026-04-27T19:06:00",
+ "2026-04-27T19:07:00",
+ "2026-04-27T19:08:00",
+ "2026-04-27T19:09:00",
+ "2026-04-27T19:10:00",
+ "2026-04-27T19:11:00",
+ "2026-04-27T19:12:00",
+ "2026-04-27T19:13:00",
+ "2026-04-27T19:14:00",
+ "2026-04-27T19:15:00",
+ "2026-04-27T19:16:00",
+ "2026-04-27T19:17:00",
+ "2026-04-27T19:18:00",
+ "2026-04-27T19:19:00",
+ "2026-04-27T19:20:00",
+ "2026-04-27T19:21:00",
+ "2026-04-27T19:22:00",
+ "2026-04-27T19:23:00",
+ "2026-04-27T19:24:00",
+ "2026-04-27T19:25:00",
+ "2026-04-27T19:26:00",
+ "2026-04-27T19:27:00",
+ "2026-04-27T19:28:00",
+ "2026-04-27T19:29:00",
+ "2026-04-27T19:30:00",
+ "2026-04-27T19:31:00",
+ "2026-04-27T19:32:00",
+ "2026-04-27T19:33:00",
+ "2026-04-27T19:34:00",
+ "2026-04-27T19:35:00",
+ "2026-04-27T19:36:00",
+ "2026-04-27T19:37:00",
+ "2026-04-27T19:38:00",
+ "2026-04-27T19:39:00",
+ "2026-04-27T19:40:00",
+ "2026-04-27T19:41:00",
+ "2026-04-27T19:42:00",
+ "2026-04-27T19:43:00",
+ "2026-04-27T19:44:00",
+ "2026-04-27T19:45:00",
+ "2026-04-27T19:46:00",
+ "2026-04-27T19:47:00",
+ "2026-04-27T19:48:00",
+ "2026-04-27T19:49:00",
+ "2026-04-27T19:50:00",
+ "2026-04-27T19:51:00",
+ "2026-04-27T19:52:00",
+ "2026-04-27T19:53:00",
+ "2026-04-27T19:54:00",
+ "2026-04-27T19:55:00",
+ "2026-04-27T19:56:00",
+ "2026-04-27T19:57:00",
+ "2026-04-27T19:58:00",
+ "2026-04-27T19:59:00",
+ "2026-04-27T20:00:00",
+ "2026-04-27T20:01:00",
+ "2026-04-27T20:02:00",
+ "2026-04-27T20:03:00",
+ "2026-04-27T20:04:00",
+ "2026-04-27T20:05:00",
+ "2026-04-27T20:06:00",
+ "2026-04-27T20:07:00",
+ "2026-04-27T20:08:00",
+ "2026-04-27T20:09:00",
+ "2026-04-27T20:10:00",
+ "2026-04-27T20:11:00",
+ "2026-04-27T20:12:00",
+ "2026-04-27T20:13:00",
+ "2026-04-27T20:14:00",
+ "2026-04-27T20:15:00",
+ "2026-04-27T20:16:00",
+ "2026-04-27T20:17:00",
+ "2026-04-27T20:18:00",
+ "2026-04-27T20:19:00",
+ "2026-04-27T20:20:00",
+ "2026-04-27T20:21:00",
+ "2026-04-27T20:22:00",
+ "2026-04-27T20:23:00",
+ "2026-04-27T20:24:00",
+ "2026-04-27T20:25:00",
+ "2026-04-27T20:26:00",
+ "2026-04-27T20:27:00",
+ "2026-04-27T20:28:00",
+ "2026-04-27T20:29:00",
+ "2026-04-27T20:30:00",
+ "2026-04-27T20:31:00",
+ "2026-04-27T20:32:00",
+ "2026-04-27T20:33:00",
+ "2026-04-27T20:34:00",
+ "2026-04-27T20:35:00",
+ "2026-04-27T20:36:00",
+ "2026-04-27T20:37:00",
+ "2026-04-27T20:38:00",
+ "2026-04-27T20:39:00",
+ "2026-04-27T20:40:00",
+ "2026-04-27T20:41:00",
+ "2026-04-27T20:42:00",
+ "2026-04-27T20:43:00",
+ "2026-04-27T20:44:00",
+ "2026-04-27T20:45:00",
+ "2026-04-27T20:46:00",
+ "2026-04-27T20:47:00",
+ "2026-04-27T20:48:00",
+ "2026-04-27T20:49:00",
+ "2026-04-27T20:50:00",
+ "2026-04-27T20:51:00",
+ "2026-04-27T20:52:00",
+ "2026-04-27T20:53:00",
+ "2026-04-27T20:54:00",
+ "2026-04-27T20:55:00",
+ "2026-04-27T20:56:00",
+ "2026-04-27T20:57:00",
+ "2026-04-27T20:58:00",
+ "2026-04-27T20:59:00",
+ "2026-04-27T21:00:00",
+ "2026-04-27T21:01:00",
+ "2026-04-27T21:02:00",
+ "2026-04-27T21:03:00",
+ "2026-04-27T21:04:00",
+ "2026-04-27T21:05:00",
+ "2026-04-27T21:06:00",
+ "2026-04-27T21:07:00",
+ "2026-04-27T21:08:00",
+ "2026-04-27T21:09:00",
+ "2026-04-27T21:10:00",
+ "2026-04-27T21:11:00",
+ "2026-04-27T21:12:00",
+ "2026-04-27T21:13:00",
+ "2026-04-27T21:14:00",
+ "2026-04-27T21:15:00",
+ "2026-04-27T21:16:00",
+ "2026-04-27T21:17:00",
+ "2026-04-27T21:18:00",
+ "2026-04-27T21:19:00",
+ "2026-04-27T21:20:00",
+ "2026-04-27T21:29:00",
+ "2026-04-27T21:30:00",
+ "2026-04-27T21:31:00",
+ "2026-04-27T21:32:00",
+ "2026-04-27T21:33:00",
+ "2026-04-27T21:34:00",
+ "2026-04-27T21:35:00",
+ "2026-04-27T21:36:00",
+ "2026-04-27T21:37:00",
+ "2026-04-27T21:38:00",
+ "2026-04-27T21:39:00",
+ "2026-04-27T21:40:00",
+ "2026-04-27T21:41:00",
+ "2026-04-27T21:42:00",
+ "2026-04-27T21:43:00",
+ "2026-04-27T21:44:00",
+ "2026-04-27T21:45:00",
+ "2026-04-27T21:46:00",
+ "2026-04-27T21:47:00",
+ "2026-04-27T21:48:00",
+ "2026-04-27T21:49:00",
+ "2026-04-27T21:50:00",
+ "2026-04-27T21:51:00",
+ "2026-04-27T21:52:00",
+ "2026-04-27T21:53:00",
+ "2026-04-27T21:54:00",
+ "2026-04-27T21:55:00",
+ "2026-04-27T21:56:00",
+ "2026-04-27T21:57:00",
+ "2026-04-27T21:58:00",
+ "2026-04-27T21:59:00",
+ "2026-04-27T22:00:00",
+ "2026-04-27T22:01:00",
+ "2026-04-27T22:02:00",
+ "2026-04-27T22:03:00",
+ "2026-04-27T22:04:00",
+ "2026-04-27T22:05:00",
+ "2026-04-27T22:06:00",
+ "2026-04-27T22:07:00",
+ "2026-04-27T22:08:00",
+ "2026-04-27T22:09:00",
+ "2026-04-27T22:10:00",
+ "2026-04-27T22:11:00",
+ "2026-04-27T22:12:00",
+ "2026-04-27T22:13:00",
+ "2026-04-27T22:14:00",
+ "2026-04-27T22:15:00",
+ "2026-04-27T22:16:00",
+ "2026-04-27T22:17:00",
+ "2026-04-27T22:18:00",
+ "2026-04-27T22:19:00",
+ "2026-04-27T22:20:00",
+ "2026-04-27T22:21:00",
+ "2026-04-27T22:22:00",
+ "2026-04-27T22:23:00",
+ "2026-04-27T22:24:00",
+ "2026-04-27T22:25:00",
+ "2026-04-27T22:26:00",
+ "2026-04-27T22:27:00",
+ "2026-04-27T22:28:00",
+ "2026-04-27T22:29:00",
+ "2026-04-27T22:30:00",
+ "2026-04-27T22:31:00",
+ "2026-04-27T22:32:00",
+ "2026-04-27T22:33:00",
+ "2026-04-27T22:34:00",
+ "2026-04-27T22:35:00",
+ "2026-04-27T22:36:00",
+ "2026-04-27T22:37:00",
+ "2026-04-27T22:38:00",
+ "2026-04-27T22:39:00",
+ "2026-04-27T22:40:00",
+ "2026-04-27T22:41:00",
+ "2026-04-27T22:42:00",
+ "2026-04-27T22:43:00",
+ "2026-04-27T22:44:00",
+ "2026-04-27T22:45:00",
+ "2026-04-27T22:46:00",
+ "2026-04-27T22:47:00",
+ "2026-04-27T22:48:00",
+ "2026-04-27T22:49:00",
+ "2026-04-27T22:50:00",
+ "2026-04-27T22:51:00",
+ "2026-04-27T22:52:00",
+ "2026-04-27T22:53:00",
+ "2026-04-27T22:54:00",
+ "2026-04-27T22:55:00",
+ "2026-04-27T22:56:00",
+ "2026-04-27T22:57:00",
+ "2026-04-27T22:58:00",
+ "2026-04-27T22:59:00",
+ "2026-04-27T23:00:00",
+ "2026-04-27T23:01:00",
+ "2026-04-27T23:02:00",
+ "2026-04-27T23:03:00",
+ "2026-04-27T23:04:00",
+ "2026-04-27T23:05:00",
+ "2026-04-27T23:06:00",
+ "2026-04-27T23:07:00",
+ "2026-04-27T23:08:00",
+ "2026-04-27T23:09:00",
+ "2026-04-27T23:10:00",
+ "2026-04-27T23:11:00",
+ "2026-04-27T23:12:00",
+ "2026-04-27T23:13:00",
+ "2026-04-27T23:14:00",
+ "2026-04-27T23:15:00",
+ "2026-04-27T23:16:00",
+ "2026-04-27T23:17:00",
+ "2026-04-27T23:18:00",
+ "2026-04-27T23:19:00",
+ "2026-04-27T23:20:00",
+ "2026-04-27T23:21:00",
+ "2026-04-27T23:22:00",
+ "2026-04-27T23:23:00",
+ "2026-04-27T23:24:00",
+ "2026-04-27T23:25:00",
+ "2026-04-27T23:26:00",
+ "2026-04-27T23:27:00",
+ "2026-04-27T23:28:00",
+ "2026-04-27T23:29:00",
+ "2026-04-27T23:30:00",
+ "2026-04-27T23:31:00",
+ "2026-04-27T23:32:00",
+ "2026-04-27T23:33:00",
+ "2026-04-27T23:34:00",
+ "2026-04-27T23:35:00",
+ "2026-04-27T23:36:00",
+ "2026-04-27T23:37:00",
+ "2026-04-27T23:38:00",
+ "2026-04-27T23:39:00",
+ "2026-04-27T23:40:00",
+ "2026-04-27T23:41:00",
+ "2026-04-27T23:42:00",
+ "2026-04-27T23:43:00",
+ "2026-04-27T23:44:00",
+ "2026-04-27T23:45:00",
+ "2026-04-27T23:46:00",
+ "2026-04-27T23:47:00",
+ "2026-04-27T23:48:00",
+ "2026-04-27T23:49:00",
+ "2026-04-27T23:50:00",
+ "2026-04-27T23:51:00",
+ "2026-04-27T23:52:00",
+ "2026-04-27T23:53:00",
+ "2026-04-27T23:54:00",
+ "2026-04-27T23:55:00",
+ "2026-04-27T23:56:00",
+ "2026-04-27T23:57:00",
+ "2026-04-27T23:58:00",
+ "2026-04-27T23:59:00",
+ "2026-04-28T00:00:00",
+ "2026-04-28T00:01:00",
+ "2026-04-28T00:02:00",
+ "2026-04-28T00:03:00",
+ "2026-04-28T00:04:00",
+ "2026-04-28T00:05:00",
+ "2026-04-28T00:06:00",
+ "2026-04-28T00:07:00",
+ "2026-04-28T00:08:00",
+ "2026-04-28T00:09:00",
+ "2026-04-28T00:10:00",
+ "2026-04-28T00:11:00",
+ "2026-04-28T00:12:00",
+ "2026-04-28T00:13:00",
+ "2026-04-28T00:14:00",
+ "2026-04-28T00:15:00",
+ "2026-04-28T00:16:00",
+ "2026-04-28T00:17:00",
+ "2026-04-28T00:18:00",
+ "2026-04-28T00:19:00",
+ "2026-04-28T00:20:00",
+ "2026-04-28T00:21:00",
+ "2026-04-28T00:22:00",
+ "2026-04-28T00:23:00",
+ "2026-04-28T00:24:00",
+ "2026-04-28T00:25:00",
+ "2026-04-28T00:26:00",
+ "2026-04-28T00:27:00",
+ "2026-04-28T00:28:00",
+ "2026-04-28T00:29:00",
+ "2026-04-28T00:30:00",
+ "2026-04-28T00:31:00",
+ "2026-04-28T00:32:00",
+ "2026-04-28T00:33:00",
+ "2026-04-28T00:34:00",
+ "2026-04-28T00:35:00",
+ "2026-04-28T00:36:00",
+ "2026-04-28T00:37:00",
+ "2026-04-28T00:38:00",
+ "2026-04-28T00:39:00",
+ "2026-04-28T00:40:00",
+ "2026-04-28T00:41:00",
+ "2026-04-28T00:42:00",
+ "2026-04-28T00:43:00",
+ "2026-04-28T00:44:00",
+ "2026-04-28T00:45:00",
+ "2026-04-28T00:46:00",
+ "2026-04-28T00:47:00",
+ "2026-04-28T00:48:00",
+ "2026-04-28T00:49:00",
+ "2026-04-28T00:50:00",
+ "2026-04-28T00:51:00",
+ "2026-04-28T00:52:00",
+ "2026-04-28T00:53:00",
+ "2026-04-28T00:54:00",
+ "2026-04-28T00:55:00",
+ "2026-04-28T00:56:00",
+ "2026-04-28T00:57:00",
+ "2026-04-28T00:58:00",
+ "2026-04-28T00:59:00",
+ "2026-04-28T01:00:00",
+ "2026-04-28T01:01:00",
+ "2026-04-28T01:02:00",
+ "2026-04-28T01:03:00",
+ "2026-04-28T01:04:00",
+ "2026-04-28T01:05:00",
+ "2026-04-28T01:06:00",
+ "2026-04-28T01:07:00",
+ "2026-04-28T01:08:00",
+ "2026-04-28T01:09:00",
+ "2026-04-28T01:10:00",
+ "2026-04-28T01:11:00",
+ "2026-04-28T01:12:00",
+ "2026-04-28T01:13:00",
+ "2026-04-28T01:14:00",
+ "2026-04-28T01:15:00",
+ "2026-04-28T01:16:00",
+ "2026-04-28T01:17:00",
+ "2026-04-28T01:18:00",
+ "2026-04-28T01:19:00",
+ "2026-04-28T01:20:00",
+ "2026-04-28T01:21:00",
+ "2026-04-28T01:22:00",
+ "2026-04-28T01:23:00",
+ "2026-04-28T01:24:00",
+ "2026-04-28T01:25:00",
+ "2026-04-28T01:26:00",
+ "2026-04-28T01:27:00",
+ "2026-04-28T01:28:00",
+ "2026-04-28T01:29:00",
+ "2026-04-28T01:30:00",
+ "2026-04-28T01:31:00",
+ "2026-04-28T01:32:00",
+ "2026-04-28T01:33:00",
+ "2026-04-28T01:34:00",
+ "2026-04-28T01:35:00",
+ "2026-04-28T01:36:00",
+ "2026-04-28T01:37:00",
+ "2026-04-28T01:38:00",
+ "2026-04-28T01:39:00",
+ "2026-04-28T01:40:00",
+ "2026-04-28T01:41:00",
+ "2026-04-28T01:42:00",
+ "2026-04-28T01:43:00",
+ "2026-04-28T01:44:00",
+ "2026-04-28T01:45:00",
+ "2026-04-28T01:46:00",
+ "2026-04-28T01:47:00",
+ "2026-04-28T01:48:00",
+ "2026-04-28T01:49:00",
+ "2026-04-28T01:50:00",
+ "2026-04-28T01:51:00",
+ "2026-04-28T01:52:00",
+ "2026-04-28T01:53:00",
+ "2026-04-28T01:54:00",
+ "2026-04-28T01:55:00",
+ "2026-04-28T01:56:00",
+ "2026-04-28T01:57:00",
+ "2026-04-28T01:58:00",
+ "2026-04-28T01:59:00",
+ "2026-04-28T02:00:00",
+ "2026-04-28T02:01:00",
+ "2026-04-28T02:02:00",
+ "2026-04-28T02:03:00",
+ "2026-04-28T02:04:00",
+ "2026-04-28T02:05:00",
+ "2026-04-28T02:06:00",
+ "2026-04-28T02:07:00",
+ "2026-04-28T02:08:00",
+ "2026-04-28T02:09:00",
+ "2026-04-28T02:10:00",
+ "2026-04-28T02:11:00",
+ "2026-04-28T02:12:00",
+ "2026-04-28T02:13:00",
+ "2026-04-28T02:14:00",
+ "2026-04-28T02:15:00",
+ "2026-04-28T02:16:00",
+ "2026-04-28T02:17:00",
+ "2026-04-28T02:18:00",
+ "2026-04-28T02:19:00",
+ "2026-04-28T02:20:00",
+ "2026-04-28T02:21:00",
+ "2026-04-28T02:22:00",
+ "2026-04-28T02:23:00",
+ "2026-04-28T02:24:00",
+ "2026-04-28T02:25:00",
+ "2026-04-28T02:26:00",
+ "2026-04-28T02:27:00",
+ "2026-04-28T02:28:00",
+ "2026-04-28T02:29:00",
+ "2026-04-28T02:30:00",
+ "2026-04-28T02:31:00",
+ "2026-04-28T02:32:00",
+ "2026-04-28T02:33:00",
+ "2026-04-28T02:34:00",
+ "2026-04-28T02:35:00",
+ "2026-04-28T02:36:00",
+ "2026-04-28T02:37:00",
+ "2026-04-28T02:38:00",
+ "2026-04-28T02:39:00",
+ "2026-04-28T02:40:00",
+ "2026-04-28T02:41:00",
+ "2026-04-28T02:42:00",
+ "2026-04-28T02:43:00",
+ "2026-04-28T02:44:00",
+ "2026-04-28T02:45:00",
+ "2026-04-28T02:46:00",
+ "2026-04-28T02:47:00",
+ "2026-04-28T02:48:00",
+ "2026-04-28T02:49:00",
+ "2026-04-28T02:50:00",
+ "2026-04-28T02:51:00",
+ "2026-04-28T02:52:00",
+ "2026-04-28T02:53:00",
+ "2026-04-28T02:54:00",
+ "2026-04-28T02:55:00",
+ "2026-04-28T02:56:00",
+ "2026-04-28T02:57:00",
+ "2026-04-28T02:58:00",
+ "2026-04-28T02:59:00",
+ "2026-04-28T03:00:00",
+ "2026-04-28T03:01:00",
+ "2026-04-28T03:02:00",
+ "2026-04-28T03:03:00",
+ "2026-04-28T03:04:00",
+ "2026-04-28T03:05:00",
+ "2026-04-28T03:06:00",
+ "2026-04-28T03:07:00",
+ "2026-04-28T03:08:00",
+ "2026-04-28T03:09:00",
+ "2026-04-28T03:10:00",
+ "2026-04-28T03:11:00",
+ "2026-04-28T03:12:00",
+ "2026-04-28T03:13:00",
+ "2026-04-28T03:14:00",
+ "2026-04-28T03:15:00",
+ "2026-04-28T03:16:00",
+ "2026-04-28T03:17:00",
+ "2026-04-28T03:18:00",
+ "2026-04-28T03:19:00",
+ "2026-04-28T03:20:00",
+ "2026-04-28T03:21:00",
+ "2026-04-28T03:22:00",
+ "2026-04-28T03:23:00",
+ "2026-04-28T03:24:00",
+ "2026-04-28T03:25:00",
+ "2026-04-28T03:26:00",
+ "2026-04-28T03:27:00",
+ "2026-04-28T03:28:00",
+ "2026-04-28T03:29:00",
+ "2026-04-28T03:30:00",
+ "2026-04-28T03:31:00",
+ "2026-04-28T03:32:00",
+ "2026-04-28T03:33:00",
+ "2026-04-28T03:34:00",
+ "2026-04-28T03:35:00",
+ "2026-04-28T03:36:00",
+ "2026-04-28T03:37:00",
+ "2026-04-28T03:38:00",
+ "2026-04-28T03:39:00",
+ "2026-04-28T03:40:00",
+ "2026-04-28T03:41:00",
+ "2026-04-28T03:42:00",
+ "2026-04-28T03:43:00",
+ "2026-04-28T03:44:00",
+ "2026-04-28T03:45:00",
+ "2026-04-28T03:46:00",
+ "2026-04-28T03:47:00",
+ "2026-04-28T03:48:00",
+ "2026-04-28T03:49:00",
+ "2026-04-28T03:50:00",
+ "2026-04-28T03:51:00",
+ "2026-04-28T03:52:00",
+ "2026-04-28T03:53:00",
+ "2026-04-28T03:54:00",
+ "2026-04-28T03:55:00",
+ "2026-04-28T03:56:00",
+ "2026-04-28T03:57:00",
+ "2026-04-28T03:58:00",
+ "2026-04-28T03:59:00",
+ "2026-04-28T04:00:00",
+ "2026-04-28T04:01:00",
+ "2026-04-28T04:02:00",
+ "2026-04-28T04:03:00",
+ "2026-04-28T04:04:00",
+ "2026-04-28T04:05:00",
+ "2026-04-28T04:06:00",
+ "2026-04-28T04:07:00",
+ "2026-04-28T04:08:00"
+ ],
+ "xaxis": "x",
+ "y": {
+ "bdata": "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",
+ "dtype": "f8"
+ },
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "legend": {
+ "tracegroupgap": 0
+ },
+ "margin": {
+ "t": 60
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#f2f5fa"
+ },
+ "error_y": {
+ "color": "#f2f5fa"
+ },
+ "marker": {
+ "line": {
+ "color": "rgb(17,17,17)",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "rgb(17,17,17)",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#A2B1C6",
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "minorgridcolor": "#506784",
+ "startlinecolor": "#A2B1C6"
+ },
+ "baxis": {
+ "endlinecolor": "#A2B1C6",
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "minorgridcolor": "#506784",
+ "startlinecolor": "#A2B1C6"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "marker": {
+ "line": {
+ "color": "#283442"
+ }
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "line": {
+ "color": "#283442"
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermap": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermap"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#506784"
+ },
+ "line": {
+ "color": "rgb(17,17,17)"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#2a3f5f"
+ },
+ "line": {
+ "color": "rgb(17,17,17)"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#f2f5fa",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#f2f5fa"
+ },
+ "geo": {
+ "bgcolor": "rgb(17,17,17)",
+ "lakecolor": "rgb(17,17,17)",
+ "landcolor": "rgb(17,17,17)",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#506784"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "dark"
+ },
+ "paper_bgcolor": "rgb(17,17,17)",
+ "plot_bgcolor": "rgb(17,17,17)",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "bgcolor": "rgb(17,17,17)",
+ "radialaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ },
+ "yaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ },
+ "zaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#f2f5fa"
+ }
+ },
+ "sliderdefaults": {
+ "bgcolor": "#C8D4E3",
+ "bordercolor": "rgb(17,17,17)",
+ "borderwidth": 1,
+ "tickwidth": 0
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "bgcolor": "rgb(17,17,17)",
+ "caxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "updatemenudefaults": {
+ "bgcolor": "#506784",
+ "borderwidth": 0
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#283442",
+ "linecolor": "#506784",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#283442",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#283442",
+ "linecolor": "#506784",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#283442",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "xaxis": {
+ "anchor": "y",
+ "domain": [
+ 0,
+ 1
+ ],
+ "title": {
+ "text": "timestamp_trade_dt"
+ }
+ },
+ "yaxis": {
+ "anchor": "x",
+ "domain": [
+ 0,
+ 1
+ ],
+ "title": {
+ "text": "qty_sum"
+ }
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "px.line(df_aster_trades_by_sec_maker, y='qty_sum', template='plotly_dark')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 191,
+ "id": "b4de9867",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "hovertemplate": "timestamp_trade_dt=%{x}
qty_sum=%{y}",
+ "legendgroup": "",
+ "line": {
+ "color": "#636efa",
+ "dash": "solid"
+ },
+ "marker": {
+ "symbol": "circle"
+ },
+ "mode": "lines",
+ "name": "",
+ "orientation": "v",
+ "showlegend": false,
+ "type": "scatter",
+ "x": [
+ "2026-04-27T15:24:00",
+ "2026-04-27T15:25:00",
+ "2026-04-27T15:26:00",
+ "2026-04-27T15:27:00",
+ "2026-04-27T15:28:00",
+ "2026-04-27T15:29:00",
+ "2026-04-27T15:30:00",
+ "2026-04-27T15:31:00",
+ "2026-04-27T15:32:00",
+ "2026-04-27T15:33:00",
+ "2026-04-27T15:34:00",
+ "2026-04-27T15:35:00",
+ "2026-04-27T15:36:00",
+ "2026-04-27T15:37:00",
+ "2026-04-27T15:38:00",
+ "2026-04-27T15:39:00",
+ "2026-04-27T15:40:00",
+ "2026-04-27T15:41:00",
+ "2026-04-27T15:42:00",
+ "2026-04-27T15:43:00",
+ "2026-04-27T15:44:00",
+ "2026-04-27T15:45:00",
+ "2026-04-27T15:46:00",
+ "2026-04-27T15:47:00",
+ "2026-04-27T15:48:00",
+ "2026-04-27T15:49:00",
+ "2026-04-27T15:50:00",
+ "2026-04-27T15:51:00",
+ "2026-04-27T15:52:00",
+ "2026-04-27T15:53:00",
+ "2026-04-27T15:54:00",
+ "2026-04-27T15:55:00",
+ "2026-04-27T15:56:00",
+ "2026-04-27T15:57:00",
+ "2026-04-27T15:58:00",
+ "2026-04-27T15:59:00",
+ "2026-04-27T16:00:00",
+ "2026-04-27T16:01:00",
+ "2026-04-27T16:02:00",
+ "2026-04-27T16:03:00",
+ "2026-04-27T16:04:00",
+ "2026-04-27T16:05:00",
+ "2026-04-27T16:06:00",
+ "2026-04-27T16:07:00",
+ "2026-04-27T16:08:00",
+ "2026-04-27T16:09:00",
+ "2026-04-27T16:10:00",
+ "2026-04-27T16:11:00",
+ "2026-04-27T16:12:00",
+ "2026-04-27T16:13:00",
+ "2026-04-27T16:14:00",
+ "2026-04-27T16:15:00",
+ "2026-04-27T16:16:00",
+ "2026-04-27T16:17:00",
+ "2026-04-27T16:18:00",
+ "2026-04-27T16:19:00",
+ "2026-04-27T16:20:00",
+ "2026-04-27T16:21:00",
+ "2026-04-27T16:22:00",
+ "2026-04-27T16:23:00",
+ "2026-04-27T16:24:00",
+ "2026-04-27T16:25:00",
+ "2026-04-27T16:26:00",
+ "2026-04-27T16:27:00",
+ "2026-04-27T16:28:00",
+ "2026-04-27T16:29:00",
+ "2026-04-27T16:30:00",
+ "2026-04-27T16:31:00",
+ "2026-04-27T16:32:00",
+ "2026-04-27T16:33:00",
+ "2026-04-27T16:34:00",
+ "2026-04-27T16:35:00",
+ "2026-04-27T16:36:00",
+ "2026-04-27T16:38:00",
+ "2026-04-27T16:39:00",
+ "2026-04-27T16:40:00",
+ "2026-04-27T16:41:00",
+ "2026-04-27T16:43:00",
+ "2026-04-27T16:44:00",
+ "2026-04-27T16:45:00",
+ "2026-04-27T16:46:00",
+ "2026-04-27T16:47:00",
+ "2026-04-27T16:48:00",
+ "2026-04-27T16:49:00",
+ "2026-04-27T16:50:00",
+ "2026-04-27T16:51:00",
+ "2026-04-27T16:52:00",
+ "2026-04-27T16:53:00",
+ "2026-04-27T16:54:00",
+ "2026-04-27T16:55:00",
+ "2026-04-27T16:56:00",
+ "2026-04-27T16:57:00",
+ "2026-04-27T16:58:00",
+ "2026-04-27T17:00:00",
+ "2026-04-27T17:01:00",
+ "2026-04-27T17:02:00",
+ "2026-04-27T17:03:00",
+ "2026-04-27T17:04:00",
+ "2026-04-27T17:05:00",
+ "2026-04-27T17:06:00",
+ "2026-04-27T17:07:00",
+ "2026-04-27T17:08:00",
+ "2026-04-27T17:09:00",
+ "2026-04-27T17:10:00",
+ "2026-04-27T17:11:00",
+ "2026-04-27T17:12:00",
+ "2026-04-27T17:13:00",
+ "2026-04-27T17:14:00",
+ "2026-04-27T17:15:00",
+ "2026-04-27T17:16:00",
+ "2026-04-27T17:18:00",
+ "2026-04-27T17:19:00",
+ "2026-04-27T17:20:00",
+ "2026-04-27T17:23:00",
+ "2026-04-27T17:24:00",
+ "2026-04-27T17:25:00",
+ "2026-04-27T17:26:00",
+ "2026-04-27T17:27:00",
+ "2026-04-27T17:28:00",
+ "2026-04-27T17:29:00",
+ "2026-04-27T17:30:00",
+ "2026-04-27T17:31:00",
+ "2026-04-27T17:32:00",
+ "2026-04-27T17:33:00",
+ "2026-04-27T17:34:00",
+ "2026-04-27T17:35:00",
+ "2026-04-27T17:36:00",
+ "2026-04-27T17:37:00",
+ "2026-04-27T17:38:00",
+ "2026-04-27T17:39:00",
+ "2026-04-27T17:40:00",
+ "2026-04-27T17:41:00",
+ "2026-04-27T17:42:00",
+ "2026-04-27T17:43:00",
+ "2026-04-27T17:44:00",
+ "2026-04-27T17:45:00",
+ "2026-04-27T17:46:00",
+ "2026-04-27T17:47:00",
+ "2026-04-27T17:48:00",
+ "2026-04-27T17:49:00",
+ "2026-04-27T17:50:00",
+ "2026-04-27T17:51:00",
+ "2026-04-27T17:53:00",
+ "2026-04-27T17:54:00",
+ "2026-04-27T17:55:00",
+ "2026-04-27T17:56:00",
+ "2026-04-27T17:58:00",
+ "2026-04-27T18:00:00",
+ "2026-04-27T18:01:00",
+ "2026-04-27T18:02:00",
+ "2026-04-27T18:03:00",
+ "2026-04-27T18:04:00",
+ "2026-04-27T18:05:00",
+ "2026-04-27T18:06:00",
+ "2026-04-27T18:07:00",
+ "2026-04-27T18:08:00",
+ "2026-04-27T18:09:00",
+ "2026-04-27T18:10:00",
+ "2026-04-27T18:11:00",
+ "2026-04-27T18:12:00",
+ "2026-04-27T18:13:00",
+ "2026-04-27T18:14:00",
+ "2026-04-27T18:17:00",
+ "2026-04-27T18:18:00",
+ "2026-04-27T18:19:00",
+ "2026-04-27T18:20:00",
+ "2026-04-27T18:21:00",
+ "2026-04-27T18:23:00",
+ "2026-04-27T18:24:00",
+ "2026-04-27T18:25:00",
+ "2026-04-27T18:26:00",
+ "2026-04-27T18:28:00",
+ "2026-04-27T18:30:00",
+ "2026-04-27T18:31:00",
+ "2026-04-27T18:32:00",
+ "2026-04-27T18:33:00",
+ "2026-04-27T18:34:00",
+ "2026-04-27T18:35:00",
+ "2026-04-27T18:38:00",
+ "2026-04-27T18:39:00",
+ "2026-04-27T18:40:00",
+ "2026-04-27T18:41:00",
+ "2026-04-27T18:42:00",
+ "2026-04-27T18:43:00",
+ "2026-04-27T18:45:00",
+ "2026-04-27T18:46:00",
+ "2026-04-27T18:47:00",
+ "2026-04-27T18:48:00",
+ "2026-04-27T18:49:00",
+ "2026-04-27T18:50:00",
+ "2026-04-27T18:51:00",
+ "2026-04-27T18:52:00",
+ "2026-04-27T18:53:00",
+ "2026-04-27T18:54:00",
+ "2026-04-27T18:55:00",
+ "2026-04-27T18:56:00",
+ "2026-04-27T18:57:00",
+ "2026-04-27T18:58:00",
+ "2026-04-27T19:00:00",
+ "2026-04-27T19:01:00",
+ "2026-04-27T19:02:00",
+ "2026-04-27T19:03:00",
+ "2026-04-27T19:04:00",
+ "2026-04-27T19:05:00",
+ "2026-04-27T19:06:00",
+ "2026-04-27T19:07:00",
+ "2026-04-27T19:13:00",
+ "2026-04-27T19:14:00",
+ "2026-04-27T19:15:00",
+ "2026-04-27T19:16:00",
+ "2026-04-27T19:17:00",
+ "2026-04-27T19:18:00",
+ "2026-04-27T19:19:00",
+ "2026-04-27T19:20:00",
+ "2026-04-27T19:21:00",
+ "2026-04-27T19:22:00",
+ "2026-04-27T19:23:00",
+ "2026-04-27T19:24:00",
+ "2026-04-27T19:25:00",
+ "2026-04-27T19:26:00",
+ "2026-04-27T19:27:00",
+ "2026-04-27T19:28:00",
+ "2026-04-27T19:29:00",
+ "2026-04-27T19:30:00",
+ "2026-04-27T19:31:00",
+ "2026-04-27T19:32:00",
+ "2026-04-27T19:33:00",
+ "2026-04-27T19:35:00",
+ "2026-04-27T19:36:00",
+ "2026-04-27T19:37:00",
+ "2026-04-27T19:38:00",
+ "2026-04-27T19:39:00",
+ "2026-04-27T19:40:00",
+ "2026-04-27T19:41:00",
+ "2026-04-27T19:42:00",
+ "2026-04-27T19:43:00",
+ "2026-04-27T19:44:00",
+ "2026-04-27T19:45:00",
+ "2026-04-27T19:46:00",
+ "2026-04-27T19:47:00",
+ "2026-04-27T19:48:00",
+ "2026-04-27T19:49:00",
+ "2026-04-27T19:50:00",
+ "2026-04-27T19:51:00",
+ "2026-04-27T19:52:00",
+ "2026-04-27T19:55:00",
+ "2026-04-27T19:56:00",
+ "2026-04-27T19:57:00",
+ "2026-04-27T19:59:00",
+ "2026-04-27T20:00:00",
+ "2026-04-27T20:01:00",
+ "2026-04-27T20:03:00",
+ "2026-04-27T20:04:00",
+ "2026-04-27T20:05:00",
+ "2026-04-27T20:06:00",
+ "2026-04-27T20:07:00",
+ "2026-04-27T20:08:00",
+ "2026-04-27T20:09:00",
+ "2026-04-27T20:10:00",
+ "2026-04-27T20:11:00",
+ "2026-04-27T20:12:00",
+ "2026-04-27T20:13:00",
+ "2026-04-27T20:14:00",
+ "2026-04-27T20:15:00",
+ "2026-04-27T20:16:00",
+ "2026-04-27T20:17:00",
+ "2026-04-27T20:20:00",
+ "2026-04-27T20:21:00",
+ "2026-04-27T20:22:00",
+ "2026-04-27T20:26:00",
+ "2026-04-27T20:27:00",
+ "2026-04-27T20:30:00",
+ "2026-04-27T20:31:00",
+ "2026-04-27T20:32:00",
+ "2026-04-27T20:33:00",
+ "2026-04-27T20:34:00",
+ "2026-04-27T20:35:00",
+ "2026-04-27T20:36:00",
+ "2026-04-27T20:37:00",
+ "2026-04-27T20:38:00",
+ "2026-04-27T20:39:00",
+ "2026-04-27T20:40:00",
+ "2026-04-27T20:44:00",
+ "2026-04-27T20:45:00",
+ "2026-04-27T20:46:00",
+ "2026-04-27T20:52:00",
+ "2026-04-27T20:54:00",
+ "2026-04-27T20:58:00",
+ "2026-04-27T20:59:00",
+ "2026-04-27T21:00:00",
+ "2026-04-27T21:01:00",
+ "2026-04-27T21:02:00",
+ "2026-04-27T21:03:00",
+ "2026-04-27T21:04:00",
+ "2026-04-27T21:05:00",
+ "2026-04-27T21:06:00",
+ "2026-04-27T21:07:00",
+ "2026-04-27T21:08:00",
+ "2026-04-27T21:09:00",
+ "2026-04-27T21:10:00",
+ "2026-04-27T21:11:00",
+ "2026-04-27T21:12:00",
+ "2026-04-27T21:15:00",
+ "2026-04-27T21:16:00",
+ "2026-04-27T21:17:00",
+ "2026-04-27T21:18:00",
+ "2026-04-27T21:19:00",
+ "2026-04-27T21:20:00",
+ "2026-04-27T21:29:00",
+ "2026-04-27T21:30:00",
+ "2026-04-27T21:32:00",
+ "2026-04-27T21:33:00",
+ "2026-04-27T21:34:00",
+ "2026-04-27T21:36:00",
+ "2026-04-27T21:37:00",
+ "2026-04-27T21:38:00",
+ "2026-04-27T21:40:00",
+ "2026-04-27T21:41:00",
+ "2026-04-27T21:42:00",
+ "2026-04-27T21:43:00",
+ "2026-04-27T21:44:00",
+ "2026-04-27T21:45:00",
+ "2026-04-27T21:46:00",
+ "2026-04-27T21:47:00",
+ "2026-04-27T21:48:00",
+ "2026-04-27T21:50:00",
+ "2026-04-27T21:51:00",
+ "2026-04-27T21:52:00",
+ "2026-04-27T21:53:00",
+ "2026-04-27T21:54:00",
+ "2026-04-27T21:55:00",
+ "2026-04-27T21:56:00",
+ "2026-04-27T21:59:00",
+ "2026-04-27T22:00:00",
+ "2026-04-27T22:01:00",
+ "2026-04-27T22:02:00",
+ "2026-04-27T22:03:00",
+ "2026-04-27T22:04:00",
+ "2026-04-27T22:05:00",
+ "2026-04-27T22:06:00",
+ "2026-04-27T22:07:00",
+ "2026-04-27T22:08:00",
+ "2026-04-27T22:09:00",
+ "2026-04-27T22:10:00",
+ "2026-04-27T22:11:00",
+ "2026-04-27T22:12:00",
+ "2026-04-27T22:15:00",
+ "2026-04-27T22:16:00",
+ "2026-04-27T22:17:00",
+ "2026-04-27T22:20:00",
+ "2026-04-27T22:21:00",
+ "2026-04-27T22:23:00",
+ "2026-04-27T22:24:00",
+ "2026-04-27T22:28:00",
+ "2026-04-27T22:29:00",
+ "2026-04-27T22:30:00",
+ "2026-04-27T22:31:00",
+ "2026-04-27T22:32:00",
+ "2026-04-27T22:33:00",
+ "2026-04-27T22:34:00",
+ "2026-04-27T22:35:00",
+ "2026-04-27T22:36:00",
+ "2026-04-27T22:38:00",
+ "2026-04-27T22:44:00",
+ "2026-04-27T22:45:00",
+ "2026-04-27T22:48:00",
+ "2026-04-27T22:49:00",
+ "2026-04-27T22:50:00",
+ "2026-04-27T22:51:00",
+ "2026-04-27T22:52:00",
+ "2026-04-27T22:55:00",
+ "2026-04-27T22:56:00",
+ "2026-04-27T22:58:00",
+ "2026-04-27T22:59:00",
+ "2026-04-27T23:00:00",
+ "2026-04-27T23:02:00",
+ "2026-04-27T23:04:00",
+ "2026-04-27T23:05:00",
+ "2026-04-27T23:06:00",
+ "2026-04-27T23:07:00",
+ "2026-04-27T23:09:00",
+ "2026-04-27T23:10:00",
+ "2026-04-27T23:11:00",
+ "2026-04-27T23:12:00",
+ "2026-04-27T23:13:00",
+ "2026-04-27T23:16:00",
+ "2026-04-27T23:17:00",
+ "2026-04-27T23:18:00",
+ "2026-04-27T23:19:00",
+ "2026-04-27T23:20:00",
+ "2026-04-27T23:23:00",
+ "2026-04-27T23:24:00",
+ "2026-04-27T23:25:00",
+ "2026-04-27T23:26:00",
+ "2026-04-27T23:28:00",
+ "2026-04-27T23:29:00",
+ "2026-04-27T23:31:00",
+ "2026-04-27T23:32:00",
+ "2026-04-27T23:33:00",
+ "2026-04-27T23:35:00",
+ "2026-04-27T23:36:00",
+ "2026-04-27T23:37:00",
+ "2026-04-27T23:38:00",
+ "2026-04-27T23:39:00",
+ "2026-04-27T23:40:00",
+ "2026-04-27T23:41:00",
+ "2026-04-27T23:42:00",
+ "2026-04-27T23:43:00",
+ "2026-04-27T23:44:00",
+ "2026-04-27T23:45:00",
+ "2026-04-27T23:46:00",
+ "2026-04-27T23:47:00",
+ "2026-04-27T23:48:00",
+ "2026-04-27T23:49:00",
+ "2026-04-27T23:50:00",
+ "2026-04-27T23:51:00",
+ "2026-04-27T23:52:00",
+ "2026-04-27T23:53:00",
+ "2026-04-27T23:54:00",
+ "2026-04-27T23:55:00",
+ "2026-04-27T23:56:00",
+ "2026-04-27T23:57:00",
+ "2026-04-27T23:58:00",
+ "2026-04-28T00:00:00",
+ "2026-04-28T00:01:00",
+ "2026-04-28T00:03:00",
+ "2026-04-28T00:04:00",
+ "2026-04-28T00:05:00",
+ "2026-04-28T00:06:00",
+ "2026-04-28T00:07:00",
+ "2026-04-28T00:09:00",
+ "2026-04-28T00:10:00",
+ "2026-04-28T00:11:00",
+ "2026-04-28T00:12:00",
+ "2026-04-28T00:13:00",
+ "2026-04-28T00:14:00",
+ "2026-04-28T00:15:00",
+ "2026-04-28T00:16:00",
+ "2026-04-28T00:17:00",
+ "2026-04-28T00:18:00",
+ "2026-04-28T00:19:00",
+ "2026-04-28T00:20:00",
+ "2026-04-28T00:21:00",
+ "2026-04-28T00:23:00",
+ "2026-04-28T00:24:00",
+ "2026-04-28T00:26:00",
+ "2026-04-28T00:27:00",
+ "2026-04-28T00:28:00",
+ "2026-04-28T00:30:00",
+ "2026-04-28T00:33:00",
+ "2026-04-28T00:34:00",
+ "2026-04-28T00:35:00",
+ "2026-04-28T00:37:00",
+ "2026-04-28T00:39:00",
+ "2026-04-28T00:40:00",
+ "2026-04-28T00:41:00",
+ "2026-04-28T00:42:00",
+ "2026-04-28T00:43:00",
+ "2026-04-28T00:44:00",
+ "2026-04-28T00:45:00",
+ "2026-04-28T00:46:00",
+ "2026-04-28T00:47:00",
+ "2026-04-28T00:48:00",
+ "2026-04-28T00:49:00",
+ "2026-04-28T00:50:00",
+ "2026-04-28T00:51:00",
+ "2026-04-28T00:52:00",
+ "2026-04-28T00:56:00",
+ "2026-04-28T00:57:00",
+ "2026-04-28T00:58:00",
+ "2026-04-28T00:59:00",
+ "2026-04-28T01:00:00",
+ "2026-04-28T01:02:00",
+ "2026-04-28T01:04:00",
+ "2026-04-28T01:06:00",
+ "2026-04-28T01:07:00",
+ "2026-04-28T01:08:00",
+ "2026-04-28T01:09:00",
+ "2026-04-28T01:10:00",
+ "2026-04-28T01:11:00",
+ "2026-04-28T01:12:00",
+ "2026-04-28T01:13:00",
+ "2026-04-28T01:14:00",
+ "2026-04-28T01:15:00",
+ "2026-04-28T01:16:00",
+ "2026-04-28T01:17:00",
+ "2026-04-28T01:18:00",
+ "2026-04-28T01:19:00",
+ "2026-04-28T01:20:00",
+ "2026-04-28T01:21:00",
+ "2026-04-28T01:22:00",
+ "2026-04-28T01:23:00",
+ "2026-04-28T01:24:00",
+ "2026-04-28T01:25:00",
+ "2026-04-28T01:26:00",
+ "2026-04-28T01:27:00",
+ "2026-04-28T01:28:00",
+ "2026-04-28T01:29:00",
+ "2026-04-28T01:30:00",
+ "2026-04-28T01:31:00",
+ "2026-04-28T01:32:00",
+ "2026-04-28T01:33:00",
+ "2026-04-28T01:34:00",
+ "2026-04-28T01:35:00",
+ "2026-04-28T01:36:00",
+ "2026-04-28T01:37:00",
+ "2026-04-28T01:38:00",
+ "2026-04-28T01:39:00",
+ "2026-04-28T01:40:00",
+ "2026-04-28T01:41:00",
+ "2026-04-28T01:42:00",
+ "2026-04-28T01:43:00",
+ "2026-04-28T01:44:00",
+ "2026-04-28T01:45:00",
+ "2026-04-28T01:46:00",
+ "2026-04-28T01:47:00",
+ "2026-04-28T01:48:00",
+ "2026-04-28T01:49:00",
+ "2026-04-28T01:50:00",
+ "2026-04-28T01:51:00",
+ "2026-04-28T01:52:00",
+ "2026-04-28T01:53:00",
+ "2026-04-28T01:54:00",
+ "2026-04-28T01:55:00",
+ "2026-04-28T01:56:00",
+ "2026-04-28T01:57:00",
+ "2026-04-28T01:58:00",
+ "2026-04-28T01:59:00",
+ "2026-04-28T02:00:00",
+ "2026-04-28T02:01:00",
+ "2026-04-28T02:02:00",
+ "2026-04-28T02:03:00",
+ "2026-04-28T02:04:00",
+ "2026-04-28T02:05:00",
+ "2026-04-28T02:06:00",
+ "2026-04-28T02:07:00",
+ "2026-04-28T02:09:00",
+ "2026-04-28T02:10:00",
+ "2026-04-28T02:12:00",
+ "2026-04-28T02:15:00",
+ "2026-04-28T02:16:00",
+ "2026-04-28T02:17:00",
+ "2026-04-28T02:19:00",
+ "2026-04-28T02:20:00",
+ "2026-04-28T02:22:00",
+ "2026-04-28T02:24:00",
+ "2026-04-28T02:25:00",
+ "2026-04-28T02:26:00",
+ "2026-04-28T02:27:00",
+ "2026-04-28T02:28:00",
+ "2026-04-28T02:29:00",
+ "2026-04-28T02:30:00",
+ "2026-04-28T02:31:00",
+ "2026-04-28T02:32:00",
+ "2026-04-28T02:33:00",
+ "2026-04-28T02:34:00",
+ "2026-04-28T02:35:00",
+ "2026-04-28T02:36:00",
+ "2026-04-28T02:37:00",
+ "2026-04-28T02:38:00",
+ "2026-04-28T02:39:00",
+ "2026-04-28T02:40:00",
+ "2026-04-28T02:41:00",
+ "2026-04-28T02:42:00",
+ "2026-04-28T02:43:00",
+ "2026-04-28T02:44:00",
+ "2026-04-28T02:45:00",
+ "2026-04-28T02:46:00",
+ "2026-04-28T02:48:00",
+ "2026-04-28T02:49:00",
+ "2026-04-28T02:50:00",
+ "2026-04-28T02:51:00",
+ "2026-04-28T02:52:00",
+ "2026-04-28T02:53:00",
+ "2026-04-28T02:54:00",
+ "2026-04-28T02:55:00",
+ "2026-04-28T02:57:00",
+ "2026-04-28T02:58:00",
+ "2026-04-28T02:59:00",
+ "2026-04-28T03:00:00",
+ "2026-04-28T03:01:00",
+ "2026-04-28T03:02:00",
+ "2026-04-28T03:03:00",
+ "2026-04-28T03:04:00",
+ "2026-04-28T03:05:00",
+ "2026-04-28T03:06:00",
+ "2026-04-28T03:07:00",
+ "2026-04-28T03:08:00",
+ "2026-04-28T03:09:00",
+ "2026-04-28T03:10:00",
+ "2026-04-28T03:11:00",
+ "2026-04-28T03:12:00",
+ "2026-04-28T03:13:00",
+ "2026-04-28T03:15:00",
+ "2026-04-28T03:17:00",
+ "2026-04-28T03:18:00",
+ "2026-04-28T03:19:00",
+ "2026-04-28T03:20:00",
+ "2026-04-28T03:22:00",
+ "2026-04-28T03:23:00",
+ "2026-04-28T03:24:00",
+ "2026-04-28T03:26:00",
+ "2026-04-28T03:28:00",
+ "2026-04-28T03:29:00",
+ "2026-04-28T03:30:00",
+ "2026-04-28T03:31:00",
+ "2026-04-28T03:34:00",
+ "2026-04-28T03:35:00",
+ "2026-04-28T03:36:00",
+ "2026-04-28T03:37:00",
+ "2026-04-28T03:38:00",
+ "2026-04-28T03:39:00",
+ "2026-04-28T03:40:00",
+ "2026-04-28T03:41:00",
+ "2026-04-28T03:44:00",
+ "2026-04-28T03:45:00",
+ "2026-04-28T03:46:00",
+ "2026-04-28T03:50:00",
+ "2026-04-28T03:51:00",
+ "2026-04-28T03:54:00",
+ "2026-04-28T03:57:00",
+ "2026-04-28T04:01:00",
+ "2026-04-28T04:02:00",
+ "2026-04-28T04:06:00"
+ ],
+ "xaxis": "x",
+ "y": {
+ "bdata": "UrgehevxMEBt5/up8TpTQPp+arx0ExpASQwCK4c2OkCgGi/dJGZDQDq0yHa+PzdAR+F6FK4HO0A3iUFg5ZBAQAIrhxbZ7jtATmIQWDkUQ0DtfD81XlpNQL+fGi/d9EFA/tR46SaRP0Av3SQGgTU6QArXo3A9OkRAvp8aL90kBkCF61G4HuUwQOf7qfHSbUhAAAAAAACoUEDfT42XblIlQG8Sg8DKoQtAK4cW2c53H0AfhetRuN5LQGmR7Xw/rIJAx0s3iUHQTUDRItv5fio8QPyp8dJN4hdAfT81XrpJB0B56SYxCHxAQA4tsp3vB0RAWDm0yHYuXUCWQ4ts5/v9P8L1KFyPIjdAsHJoke18MkAfhetRuH5IQCLb+X5qvBpAGy/dJAahOkAlBoGVQ4sZQI2XbhKDwAxAokW28/3UCkDVeOkmMYg0QAisHFpkuxpA16NwPQrXA0CsHFpkO18WQIGVQ4tsZzlArkfhehSuBUBSuB6F61HkPzvfT42XbvI/6SYxCKwc2j99PzVeuknkP9ejcD0KVxxA46WbxCCw5j+0yHa+nxoJQC/dJAaBlQVAhetRuB4FLkAnMQisHFomQM/3U+OlWyZApHA9CtdDRkB7FK5H4XqEP7bz/dR46QpAd76fGi/dF0DXo3A9CtfbP30/NV66Scw/jZduEoPAyj9oke18P7URQCGwcmiR7f4/pHA9Ctej8D9iEFg5tMjyP+f7qfHSTSRAXI/C9ShcBEAZBFYOLbIsQL6fGi/dZCFAg8DKoUW2CEDZzvdT46UFQO58PzVeuhRAd76fGi+dNUAOLbKd72c7QBSuR+F6FAhA/Knx0k0CPkD8qfHSTWJQP4cW2c73UyBArBxaZDvf7z+mm8QgsHIcQNejcD0K18M/pHA9Ctej4D8hsHJokW0tQDzfT42XnmRAbOf7qfFyM0B7FK5H4foYQAAAAAAAwCVA9ihcj8L1IkDl0CLb+Y5OQOf7qfHSDS9AYxBYObTIQEAnMQisHFoXQG3n+6nxEidA30+Nl26SEkDAyqFFtvMAQAAAAAAAIDVABFYOLbJdI0Dn+6nx0k3CP+xRuB6F6xpAvHSTGATWJ0AbL90kBgE2QCcxCKwcWtQ/+n5qvHSTuD97FK5H4XqEP2IQWDm0SBtAMQisHFpk4z+sHFpkOx8mQNnO91PjZTJAmpmZmZmZuT8+CtejcL0fQGu8dJMYZDtAg8DKoUW2wz9/arx0kxgAQFK4HoXrUbg/0SLb+X5qLkBANV66SQwUQCGwcmiRrS5AWDm0yHa+vz8UrkfhepQSQClcj8L1KLw/exSuR+F6hD+8dJMYBFYDQIGVQ4tshzpAtvP91HhpHECyne+nxkvzPzvfT42XbtI/6SYxCKwcEkDTTWIQWLk+QFpkO99PjRBAUrgehetRuD+BlUOLbOcGQOF6FK5H4bo/g8DKoUW2F0AAAAAAAEA6QDeJQWDl0ARAlkOLbOc7JUAAAAAAAAAAQIlBYOXQYjJAAAAAAAAA4D8Sg8DKoYUsQObQItv5fuY/7Xw/NV667T9YObTIdr4UQHsUrkfhOi5Ay6FFtvP9CUDGSzeJQWD1P2ZmZmZmZg5AexSuR+F6hD/Jdr6fGk8zQI2XbhKDwAVAK4cW2c736z8QWDm0yHb2P/7UeOkmcS1Ake18PzVeF0BKDAIrhxb3PzVeukkMAhhATmIQWDm06D97FK5H4XqEP1pkO99PjQtA1XjpJjEIzD+iRbbz/dQLQJhuEoPAqjhAukkMAiuHE0BxPQrXo7AiQHsUrkfheoQ/JzEIrBxaEEDwp8ZLN6k3QFCNl24SAx9A2c73U+OlC0CamZmZmZkRQCPb+X5qvLQ/4noUrkdhEEB7FK5H4XqEP0jhehSuRxZA0SLb+X5qJEAAAAAAAADAPwaBlUOLbABAj8L1KFyP4j8bL90kBoGlP4cW2c73U/U/MQisHFpk4z/TTWIQWDn+P1g5tMh2vr8/GARWDi1yIUDLoUW2870xQAAAAAAAAOA/ZmZmZmZmCUA730+Nl26iPwrXo3A9Cqc/9ihcj8L18j+LbOf7qTEiQEjhehSu10dAZmZmZmZmHkAxCKwcWmQiQL10kxgEtkJApHA9Ctej4D/b+X5qvHQBQOOlm8QgMCRARIts5/upAkD6fmq8dJPoPzEIrBxaZBRAWmQ7309NIkAAAAAAAAAgQHnpJjEIrIw/AAAAAAAAEEBEi2zn+ykZQPhT46WbRBxA001iEFg5tD+yne+nxssRQPp+arx0o0dARrbz/dR4RkDfT42XbhIQQKabxCCwcv4/+FPjpZvEwD9qvHSTGMQtQE5iEFg5tBVADAIrhxbZC0B1kxgEVg4EQM3MzMzMzDlAWmQ7309NIEC28/3UeIFSQARWDi2yne8/AAAAAAAAJEBQjZduEoMJQIts5/up8do/arx0kxgEtj9qvHSTGAS2P39qvHSTGOQ/vp8aL90k+D+iRbbz/dTsPwAAAAAAADVAWDm0yHa+1z/P91PjpZsDQJDC9ShcjxZAcT0K16NwvT91kxgEVg77P58aL90kRiZAAAAAAAAAFEDqJjEIrByqP7Kd76fGS7c/ObTIdr6f6j+28/3UeOkVQGu8dJMYBMY/5KWbxCCwwj+YbhKDwMrBP3oUrkfh+h1AnMQgsHLoK0BaZDvfT423P2IQWDm0yPI/ukkMAiuHhj8730+Nl27wPzm0yHa+n5o/3SQGgZUDK0DrUbgehbtCQCPb+X5qvOw/9ihcj8L1AEBYObTIdn4mQF66SQwCKxhAzczMzMxMHUAAAAAAAADwPx+F61G4HsU/WmQ730+Ntz9t5/up8dLhP3sUrkfheoQ/Gy/dJAaBpT8OLbKd72cqQP7UeOkmMfA/SQwCK4cWyT+cxCCwcmjRP24Sg8DKocU//Knx0k1ikD/+1HjpJnEiQPyp8dJNYlA/m8QgsHJo7T8xCKwcWmT5P76fGi/dJMY/5KWbxCAwLED8qfHSTWLgPwAAAAAAABZAH4XrUbieEkCgGi/dJAYEQOXQItv5fhNAF9nO91Pj3T9/arx0kxj2P83MzMzMDEdARbbz/dR4EEBU46WbxOAlQDMzMzMzUzFAukkMAiuHhj8zMzMzM3MoQAAAAAAAwCVAi2zn+6lxJUC6SQwCK4eGP9v5fmq8dNM/ukkMAiuHhj82XrpJDNpUQC/dJAaBlec/ZTvfT42X7j8CK4cW2c7zP3e+nxovnSxAN4lBYOXQ9D9oke18PzW+P7pJDAIrh4Y/Gy/dJAaBF0C+nxov3SQCQEjhehSuR/k/+n5qvHSTiD+6SQwCK4eGP/p+arx0k7g/hetRuB6Fyz+6SQwCK4eGP2U730+Nl/w/hetRuB4FJkD8qfHSTWLgP90kBoGVQxpAAiuHFtmOI0AAAAAAAAAYQF66SQwCKzZAnu+nxkv3JEB/arx0kxglQGiR7Xw/9TBA+n5qvHSTiD+6SQwCK4eGP57vp8ZLN/0/qvHSTWKQEEB56SYxCOwnQKrx0k1ikC5Ad76fGi/dAEBiEFg5tMgAQIGVQ4ts5w5AmpmZmZm5PkD4U+Olm8TgP8P1KFyP4jZAz/dT46VbI0AdWmQ7388TQPHSTWIQGDBAqvHSTWIQ8j/hehSuR+G6PwAAAAAAACRAVOOlm8SgGUCiRbbz/dQTQHNoke18PxBALbKd76fG5z8dWmQ730/9P+Olm8QgsBZAAAAAAAAA8D/y0k1iEFgWQAAAAAAAABRAaJHtfD+1JEAAAAAAAAAUQClcj8L1KCpAwcqhRbbz1T+Ol24Sg8DKP2q8dJMY5DVAbxKDwMrhQUD2KFyPwnUVQHnpJjEILCVAWDm0yHY+LkAAAAAAAADwPwAAAAAAAPA/2/l+arx0wz/6fmq8dJPkPwisHFpk+yFAAAAAAAAA4D+Nl24Sg8DiPwAAAAAAAPA/qvHSTWIQ6D97FK5H4XqEP3sUrkfherQ/7FG4HoXroT++nxov3aQsQCuHFtnO9+M/EFg5tMh2JkB7FK5H4Xr0Pzq0yHa+nxFAvXSTGASWJ0A5tMh2vp+KP1K4HoXrkSpASgwCK4cW4T85tMh2vp+KP2ZmZmZmZgJAexSuR+F6hD/8qfHSTWJQP9V46SYxqDlAeekmMQisnD+6SQwCK4emPzvfT42XbqI/O99PjZdu0j/ByqFFtnMhQClcj8L1qBFAO99PjZdusj9xPQrXo3DlPxsv3SQGgfk/YOXQItv5vj9aZDvfT42nP6wcWmQ73+M/UrgehesRMECcxCCwciguQC2yne+nBiRAMzMzMzMTNEAAAAAAAAAkQHNoke18P7U/+n5qvHSTiD8pXI/C9SisP9ijcD0K1+s/TDeJQWDFMUAQWDm0yDY1QLpJDAIrh5Y/AAAAAAAAJED8qfHSTWKgP9v5fmq8dJM/9ihcj8I1JED2KFyPwvUUQPLSTWIQGC9AkML1KFyP9j9eukkMAgs4QAIrhxbZXkNAXrpJDAI7QEA1XrpJDAI3QO+nxks3iQhAku18PzVeKUAhsHJoka01QAIrhxbZzg9AAiuHFtnO1z/VeOkmMQgIQAAAAAAAAARA+n5qvHSTmD/P91PjpZvUP2q8dJMYhBFAokW28/10MUDm0CLb+R4xQN9PjZduEhxA/Knx0k1ikD956SYxCKzcPwAAAAAAAARAUrgehetRuD/dJAaBlYMnQPT91Hjp5idAWmQ7308NFUD6fmq8dJOoP24Sg8DKoRpAc2iR7Xz/MkBWDi2yne/nP5zEILBy6ChAZmZmZmZmEUD4U+Olm8TAP/p+arx0k9g/cT0K16PwLUBaZDvfT43rP9V46SYxqDBAUrgehetRDkCOl24Sg8DwP0w3iUFg5aA/OrTIdr6fHEDHSzeJQWAJQP///////98/DAIrhxZZE0Dm0CLb+X7SP8HKoUW2870/aJHtfD81K0Cq8dJNYhCoPzvfT42XbhpAw/UoXI/CB0ArhxbZzvcIQEw3iUFg5eA/okW28/2UKkA+CtejcD30P3sUrkfheug/QDVeukkME0D+1HjpJjEFQPLSTWIQWLk/aJHtfD+1FkDHSzeJQWAyQPyp8dJNYqA/8tJNYhBYyT/EILByaJH7P/yp8dJNYqA//Knx0k1ioD/8qfHSTWKgP8uhRbbz/RRAUI2XbhKD8D/8qfHSTWKgP6wcWmQ73xtAO99PjZduCEDHSzeJQeAhQFCNl24Sg+A//Knx0k1ioD9pke18P7UTQPyp8dJNYqA/sp3vp8ZL6z/8qfHSTWKgP1+6SQwCqxFAjGzn+6nxoj8fhetRuP4zQJzEILByaKE//Knx0k1i5D+e76fGSzf9P+58PzVeuhJAmG4Sg8DKEUCPwvUoXI8DQKrx0k1iEOw/BFYOLbKd8z8xCKwcWmTxP5zEILByaKE/SgwCK4cWqT/Xo3A9CpciQClcj8L1KBlAnMQgsHJooT+YbhKDwAonQBxaZDvfjylAjZduEoMgNkCLbOf7qfEPQJzEILByaKE/4E+Nl24Swz9MN4lBYOUNQPYoXI/C9Q1AUI2XbhKD6D/+1HjpJrE2QJzEILByaKE/nMQgsHJooT/hehSuR+G6P5zEILByaKE/cT0K16PwGECOl24SgwAkQMuhRbbz/RVAx0s3iUEANkDJdr6fGi+9P/T91HjpJhZAnMQgsHJooT81XrpJDAL1PwAAAAAAABVATmIQWDm0+D8lBoGVQ4vgPwwCK4cWWSBAAAAAAAAA8D/n+6nx0k0OQIGVQ4ts5/s/30+Nl24SH0AUrkfhehQQQGq8dJMYBKY/xSCwcmhRIEB3vp8aL10uQBgEVg4tMidA5KWbxCDAQ0AlBoGVQ2s4QDeJQWDlUChAE4PAyqHBe0Aj2/l+apxNQG3n+6nx6lZAexSuR+EaQkD4U+Olm9RAQI/C9ShcjyZAYhBYObToPEBI4XoUrkcZQMUgsHJoIUdABFYOLbLdJEBoke18P1U2QG8Sg8DKsVpAGi/dJAaB/T/dJAaBlcMZQNV46SYxCPo/Di2yne+n9j/LoUW28z0pQM3MzMzMzAZAarx0kxgExj8rhxbZznccQPYoXI/C9fg/+n5qvHSTuD8MAiuHFtkCQB1aZDvfzxVA2/l+arz0EUBnZmZmZmb+PxKDwMqhxRJA/Knx0k1i9j+28/3UeGkRQPp+arx0k7g/QmDl0CLb8T9g5dAi2zkrQAIrhxbZLjBAAAAAAAAAAEBANV66SQwFQHe+nxov3QhADy2yne+n4j90kxgEVm4/QFK4HoXrURZAAAAAAAAA8D+amZmZmZnJPyGwcmiR7eA/KVyPwvUoCEArhxbZzvejP4ts5/up8aI/RIts5/spbEDdJAaBlX9uQJqZmZmZ6UBAy6FFtvP98j9KDAIrh1YuQA4tsp3v5ydApHA9CtfTcEArhxbZzvejP6AaL90kBgVAw/UoXI+CIEArhxbZzvezP2ZmZmZmZvA/CKwcWmQ7/T97FK5H4XrEP8HKoUW28whA0SLb+X5qFUAK16NwPQrnP1K4HoXrES1AJzEIrBxaLUBMN4lBYOURQDVeukkMAus/8KfGSzeJH0A+CtejcD0UQMl2vp8aL+k/FK5H4XoUJ0DJdr6fGi+9P1TjpZvEIMA/eekmMQjsN0AAAAAAAADgP873U+OlmwZA",
+ "dtype": "f8"
+ },
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "legend": {
+ "tracegroupgap": 0
+ },
+ "margin": {
+ "t": 60
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#f2f5fa"
+ },
+ "error_y": {
+ "color": "#f2f5fa"
+ },
+ "marker": {
+ "line": {
+ "color": "rgb(17,17,17)",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "rgb(17,17,17)",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#A2B1C6",
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "minorgridcolor": "#506784",
+ "startlinecolor": "#A2B1C6"
+ },
+ "baxis": {
+ "endlinecolor": "#A2B1C6",
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "minorgridcolor": "#506784",
+ "startlinecolor": "#A2B1C6"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "marker": {
+ "line": {
+ "color": "#283442"
+ }
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "line": {
+ "color": "#283442"
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermap": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermap"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#506784"
+ },
+ "line": {
+ "color": "rgb(17,17,17)"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#2a3f5f"
+ },
+ "line": {
+ "color": "rgb(17,17,17)"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#f2f5fa",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#f2f5fa"
+ },
+ "geo": {
+ "bgcolor": "rgb(17,17,17)",
+ "lakecolor": "rgb(17,17,17)",
+ "landcolor": "rgb(17,17,17)",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#506784"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "dark"
+ },
+ "paper_bgcolor": "rgb(17,17,17)",
+ "plot_bgcolor": "rgb(17,17,17)",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "bgcolor": "rgb(17,17,17)",
+ "radialaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ },
+ "yaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ },
+ "zaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#f2f5fa"
+ }
+ },
+ "sliderdefaults": {
+ "bgcolor": "#C8D4E3",
+ "bordercolor": "rgb(17,17,17)",
+ "borderwidth": 1,
+ "tickwidth": 0
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "bgcolor": "rgb(17,17,17)",
+ "caxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "updatemenudefaults": {
+ "bgcolor": "#506784",
+ "borderwidth": 0
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#283442",
+ "linecolor": "#506784",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#283442",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#283442",
+ "linecolor": "#506784",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#283442",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "xaxis": {
+ "anchor": "y",
+ "domain": [
+ 0,
+ 1
+ ],
+ "title": {
+ "text": "timestamp_trade_dt"
+ }
+ },
+ "yaxis": {
+ "anchor": "x",
+ "domain": [
+ 0,
+ 1
+ ],
+ "title": {
+ "text": "qty_sum"
+ }
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "px.line(df_extend_trades_by_sec_maker, y='qty_sum', template='plotly_dark')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 192,
+ "id": "56f94403",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_comb_trades_by_sec = df_aster_trades_by_sec_taker[['price_median']].merge(df_extend_trades_by_sec_maker[['price_median']], left_index=True, right_index=True, suffixes=('_aster','_extend'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 193,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_comb_trades_by_sec['ratio'] = df_comb_trades_by_sec['price_median_aster'] / df_comb_trades_by_sec['price_median_extend']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 194,
+ "id": "663d036f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# df_comb_trades_by_sec = df_comb_trades_by_sec.reset_index().groupby(pd.Grouper(key='timestamp_trade_dt', freq='h')).agg({'price_median_aster': 'median', 'price_median_extend': 'median', 'ratio': 'median'}) # Resting on the ask (seller is maker): BID [Taker] [Buyer] -- Crossed into --> ASK [Maker] [Seller]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 195,
+ "id": "66c5a128",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.46955128205128205"
+ ]
+ },
+ "execution_count": 195,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(df_comb_trades_by_sec.loc[df_comb_trades_by_sec['ratio'] > 1]) / len(df_comb_trades_by_sec)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 196,
+ "id": "a454f3c4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.530448717948718"
+ ]
+ },
+ "execution_count": 196,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(df_comb_trades_by_sec.loc[df_comb_trades_by_sec['ratio'] <= 1]) / len(df_comb_trades_by_sec)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 197,
+ "id": "bf9af769",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "min_time = max([round(df_comb_trades_by_sec.index.min().timestamp()*1000), int(round(df_fr['timestamp'].min()))])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 198,
+ "id": "a0b4ab50",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_comb_trades_by_sec_plot = df_comb_trades_by_sec.loc[df_comb_trades_by_sec.index.values.astype(np.int64) > min_time,:]\n",
+ "df_fr_plot = df_fr.loc[df_fr['timestamp'] > min_time,:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 199,
+ "id": "b724d368",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.microsoft.datawrangler.viewer.v0+json": {
+ "columns": [
+ {
+ "name": "timestamp_trade_dt",
+ "rawType": "datetime64[ms]",
+ "type": "datetime"
+ },
+ {
+ "name": "price_median_aster",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "price_median_extend",
+ "rawType": "float64",
+ "type": "float"
+ },
+ {
+ "name": "ratio",
+ "rawType": "float64",
+ "type": "float"
+ }
+ ],
+ "ref": "a60cea97-0362-41f0-907b-6427d6400779",
+ "rows": [
+ [
+ "2026-04-27 15:24:00",
+ "2267.7",
+ "2269.5",
+ "0.9992068737607401"
+ ],
+ [
+ "2026-04-27 15:25:00",
+ "2267.3",
+ "2267.25",
+ "1.000022053148087"
+ ],
+ [
+ "2026-04-27 15:26:00",
+ "2268.3",
+ "2267.6",
+ "1.0003086964191217"
+ ],
+ [
+ "2026-04-27 15:27:00",
+ "2271.6099999999997",
+ "2271.6",
+ "1.0000044021834829"
+ ],
+ [
+ "2026-04-27 15:28:00",
+ "2271.225",
+ "2270.7",
+ "1.0002312062359626"
+ ],
+ [
+ "2026-04-27 15:29:00",
+ "2273.0950000000003",
+ "2272.1",
+ "1.0004379208661591"
+ ],
+ [
+ "2026-04-27 15:30:00",
+ "2276.0",
+ "2275.4",
+ "1.0002636899006767"
+ ],
+ [
+ "2026-04-27 15:31:00",
+ "2280.21",
+ "2282.05",
+ "0.9991937074121952"
+ ],
+ [
+ "2026-04-27 15:32:00",
+ "2280.6",
+ "2281.6",
+ "0.9995617110799438"
+ ],
+ [
+ "2026-04-27 15:33:00",
+ "2281.0699999999997",
+ "2280.45",
+ "1.000271876164792"
+ ],
+ [
+ "2026-04-27 15:34:00",
+ "2279.6",
+ "2279.0",
+ "1.0002632733655112"
+ ],
+ [
+ "2026-04-27 15:35:00",
+ "2280.2650000000003",
+ "2280.9",
+ "0.9997216011223641"
+ ],
+ [
+ "2026-04-27 15:36:00",
+ "2279.71",
+ "2280.2",
+ "0.9997851065695993"
+ ],
+ [
+ "2026-04-27 15:37:00",
+ "2279.7",
+ "2280.1",
+ "0.9998245690978466"
+ ],
+ [
+ "2026-04-27 15:38:00",
+ "2279.755",
+ "2279.7",
+ "1.0000241259814888"
+ ],
+ [
+ "2026-04-27 15:39:00",
+ "2280.58",
+ "2280.8",
+ "0.9999035426166256"
+ ],
+ [
+ "2026-04-27 15:40:00",
+ "2279.92",
+ "2280.4",
+ "0.9997895106121732"
+ ],
+ [
+ "2026-04-27 15:41:00",
+ "2281.54",
+ "2281.0",
+ "1.0002367382726873"
+ ],
+ [
+ "2026-04-27 15:42:00",
+ "2282.005",
+ "2282.4",
+ "0.9998269365580091"
+ ],
+ [
+ "2026-04-27 15:43:00",
+ "2281.395",
+ "2281.1",
+ "1.0001293235719608"
+ ],
+ [
+ "2026-04-27 15:44:00",
+ "2281.3",
+ "2281.7",
+ "0.999824692115528"
+ ],
+ [
+ "2026-04-27 15:45:00",
+ "2280.5",
+ "2280.8",
+ "0.9998684672044895"
+ ],
+ [
+ "2026-04-27 15:46:00",
+ "2279.125",
+ "2280.0",
+ "0.9996162280701755"
+ ],
+ [
+ "2026-04-27 15:47:00",
+ "2278.645",
+ "2278.6",
+ "1.000019748968665"
+ ],
+ [
+ "2026-04-27 15:48:00",
+ "2276.79",
+ "2277.2",
+ "0.9998199543298789"
+ ],
+ [
+ "2026-04-27 15:49:00",
+ "2275.48",
+ "2274.75",
+ "1.0003209143861962"
+ ],
+ [
+ "2026-04-27 15:50:00",
+ "2273.98",
+ "2272.9",
+ "1.0004751638875444"
+ ],
+ [
+ "2026-04-27 15:51:00",
+ "2274.7",
+ "2274.0",
+ "1.0003078276165347"
+ ],
+ [
+ "2026-04-27 15:52:00",
+ "2273.29",
+ "2274.2",
+ "0.9995998592911793"
+ ],
+ [
+ "2026-04-27 15:53:00",
+ "2273.5550000000003",
+ "2273.1",
+ "1.0002001671725838"
+ ],
+ [
+ "2026-04-27 15:54:00",
+ "2274.57",
+ "2274.4",
+ "1.000074744987689"
+ ],
+ [
+ "2026-04-27 15:55:00",
+ "2275.09",
+ "2274.8",
+ "1.0001274837348337"
+ ],
+ [
+ "2026-04-27 15:56:00",
+ "2273.525",
+ "2274.3",
+ "0.9996592358088202"
+ ],
+ [
+ "2026-04-27 15:57:00",
+ "2273.23",
+ "2273.2",
+ "1.000013197254971"
+ ],
+ [
+ "2026-04-27 15:58:00",
+ "2272.91",
+ "2272.8",
+ "1.0000483984512494"
+ ],
+ [
+ "2026-04-27 15:59:00",
+ "2273.245",
+ "2272.8",
+ "1.0001957937346004"
+ ],
+ [
+ "2026-04-27 16:00:00",
+ "2271.72",
+ "2272.0",
+ "0.9998767605633802"
+ ],
+ [
+ "2026-04-27 16:01:00",
+ "2270.8",
+ "2270.7",
+ "1.0000440392830405"
+ ],
+ [
+ "2026-04-27 16:02:00",
+ "2271.3900000000003",
+ "2270.9",
+ "1.0002157734818795"
+ ],
+ [
+ "2026-04-27 16:03:00",
+ "2270.2",
+ "2269.8",
+ "1.0001762269803505"
+ ],
+ [
+ "2026-04-27 16:04:00",
+ "2273.14",
+ "2273.7",
+ "0.9997537054140828"
+ ],
+ [
+ "2026-04-27 16:05:00",
+ "2273.21",
+ "2273.0",
+ "1.0000923889133304"
+ ],
+ [
+ "2026-04-27 16:06:00",
+ "2274.925",
+ "2275.1499999999996",
+ "0.9999011054216208"
+ ],
+ [
+ "2026-04-27 16:07:00",
+ "2275.58",
+ "2275.2",
+ "1.000167018284107"
+ ],
+ [
+ "2026-04-27 16:08:00",
+ "2273.68",
+ "2273.6",
+ "1.0000351864883885"
+ ],
+ [
+ "2026-04-27 16:09:00",
+ "2274.05",
+ "2273.0",
+ "1.000461944566652"
+ ],
+ [
+ "2026-04-27 16:10:00",
+ "2274.28",
+ "2274.2",
+ "1.0000351772051712"
+ ],
+ [
+ "2026-04-27 16:11:00",
+ "2275.0",
+ "2274.55",
+ "1.0001978413312522"
+ ],
+ [
+ "2026-04-27 16:12:00",
+ "2276.41",
+ "2276.2",
+ "1.0000922590282049"
+ ],
+ [
+ "2026-04-27 16:13:00",
+ "2276.855",
+ "2276.45",
+ "1.0001779085857367"
+ ]
+ ],
+ "shape": {
+ "columns": 3,
+ "rows": 624
+ }
+ },
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " price_median_aster | \n",
+ " price_median_extend | \n",
+ " ratio | \n",
+ "
\n",
+ " \n",
+ " | timestamp_trade_dt | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2026-04-27 15:24:00 | \n",
+ " 2267.700 | \n",
+ " 2269.50 | \n",
+ " 0.999207 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-27 15:25:00 | \n",
+ " 2267.300 | \n",
+ " 2267.25 | \n",
+ " 1.000022 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-27 15:26:00 | \n",
+ " 2268.300 | \n",
+ " 2267.60 | \n",
+ " 1.000309 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-27 15:27:00 | \n",
+ " 2271.610 | \n",
+ " 2271.60 | \n",
+ " 1.000004 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-27 15:28:00 | \n",
+ " 2271.225 | \n",
+ " 2270.70 | \n",
+ " 1.000231 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-28 03:54:00 | \n",
+ " 2287.500 | \n",
+ " 2287.10 | \n",
+ " 1.000175 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-28 03:57:00 | \n",
+ " 2289.310 | \n",
+ " 2288.60 | \n",
+ " 1.000310 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-28 04:01:00 | \n",
+ " 2288.115 | \n",
+ " 2288.20 | \n",
+ " 0.999963 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-28 04:02:00 | \n",
+ " 2287.370 | \n",
+ " 2287.40 | \n",
+ " 0.999987 | \n",
+ "
\n",
+ " \n",
+ " | 2026-04-28 04:06:00 | \n",
+ " 2287.710 | \n",
+ " 2287.10 | \n",
+ " 1.000267 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
624 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " price_median_aster price_median_extend ratio\n",
+ "timestamp_trade_dt \n",
+ "2026-04-27 15:24:00 2267.700 2269.50 0.999207\n",
+ "2026-04-27 15:25:00 2267.300 2267.25 1.000022\n",
+ "2026-04-27 15:26:00 2268.300 2267.60 1.000309\n",
+ "2026-04-27 15:27:00 2271.610 2271.60 1.000004\n",
+ "2026-04-27 15:28:00 2271.225 2270.70 1.000231\n",
+ "... ... ... ...\n",
+ "2026-04-28 03:54:00 2287.500 2287.10 1.000175\n",
+ "2026-04-28 03:57:00 2289.310 2288.60 1.000310\n",
+ "2026-04-28 04:01:00 2288.115 2288.20 0.999963\n",
+ "2026-04-28 04:02:00 2287.370 2287.40 0.999987\n",
+ "2026-04-28 04:06:00 2287.710 2287.10 1.000267\n",
+ "\n",
+ "[624 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 199,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_comb_trades_by_sec"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d228c87c",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 200,
+ "id": "2b286bff",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.microsoft.datawrangler.viewer.v0+json": {
+ "columns": [
+ {
+ "name": "index",
+ "rawType": "int64",
+ "type": "integer"
+ },
+ {
+ "name": "market",
+ "rawType": "str",
+ "type": "string"
+ },
+ {
+ "name": "funding_rate",
+ "rawType": "str",
+ "type": "string"
+ },
+ {
+ "name": "timestamp",
+ "rawType": "int64",
+ "type": "integer"
+ },
+ {
+ "name": "timestamp_dt",
+ "rawType": "datetime64[ms]",
+ "type": "datetime"
+ }
+ ],
+ "ref": "d9166728-98a2-438d-aa38-69e6992d8c99",
+ "rows": [
+ [
+ "0",
+ "ETH-USD",
+ "-0.000023",
+ "1777348801028",
+ "2026-04-28 04:00:01.028000"
+ ],
+ [
+ "1",
+ "ETH-USD",
+ "-0.000002",
+ "1777345201018",
+ "2026-04-28 03:00:01.018000"
+ ],
+ [
+ "2",
+ "ETH-USD",
+ "0.000003",
+ "1777341601019",
+ "2026-04-28 02:00:01.019000"
+ ],
+ [
+ "3",
+ "ETH-USD",
+ "-0.000001",
+ "1777338001032",
+ "2026-04-28 01:00:01.032000"
+ ],
+ [
+ "4",
+ "ETH-USD",
+ "0.000011",
+ "1777334401026",
+ "2026-04-28 00:00:01.026000"
+ ],
+ [
+ "5",
+ "ETH-USD",
+ "0",
+ "1777330801011",
+ "2026-04-27 23:00:01.011000"
+ ],
+ [
+ "6",
+ "ETH-USD",
+ "0.000013",
+ "1777327200342",
+ "2026-04-27 22:00:00.342000"
+ ],
+ [
+ "7",
+ "ETH-USD",
+ "-0.000003",
+ "1777323600342",
+ "2026-04-27 21:00:00.342000"
+ ],
+ [
+ "8",
+ "ETH-USD",
+ "0",
+ "1777320000722",
+ "2026-04-27 20:00:00.722000"
+ ],
+ [
+ "9",
+ "ETH-USD",
+ "0.000003",
+ "1777316400934",
+ "2026-04-27 19:00:00.934000"
+ ],
+ [
+ "10",
+ "ETH-USD",
+ "-0.000015",
+ "1777312801025",
+ "2026-04-27 18:00:01.025000"
+ ],
+ [
+ "11",
+ "ETH-USD",
+ "-0.000007",
+ "1777309201012",
+ "2026-04-27 17:00:01.012000"
+ ],
+ [
+ "12",
+ "ETH-USD",
+ "0.000013",
+ "1777305600343",
+ "2026-04-27 16:00:00.343000"
+ ]
+ ],
+ "shape": {
+ "columns": 4,
+ "rows": 13
+ }
+ },
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " market | \n",
+ " funding_rate | \n",
+ " timestamp | \n",
+ " timestamp_dt | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " ETH-USD | \n",
+ " -0.000023 | \n",
+ " 1777348801028 | \n",
+ " 2026-04-28 04:00:01.028 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " ETH-USD | \n",
+ " -0.000002 | \n",
+ " 1777345201018 | \n",
+ " 2026-04-28 03:00:01.018 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " ETH-USD | \n",
+ " 0.000003 | \n",
+ " 1777341601019 | \n",
+ " 2026-04-28 02:00:01.019 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " ETH-USD | \n",
+ " -0.000001 | \n",
+ " 1777338001032 | \n",
+ " 2026-04-28 01:00:01.032 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " ETH-USD | \n",
+ " 0.000011 | \n",
+ " 1777334401026 | \n",
+ " 2026-04-28 00:00:01.026 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " ETH-USD | \n",
+ " 0 | \n",
+ " 1777330801011 | \n",
+ " 2026-04-27 23:00:01.011 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " ETH-USD | \n",
+ " 0.000013 | \n",
+ " 1777327200342 | \n",
+ " 2026-04-27 22:00:00.342 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " ETH-USD | \n",
+ " -0.000003 | \n",
+ " 1777323600342 | \n",
+ " 2026-04-27 21:00:00.342 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " ETH-USD | \n",
+ " 0 | \n",
+ " 1777320000722 | \n",
+ " 2026-04-27 20:00:00.722 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " ETH-USD | \n",
+ " 0.000003 | \n",
+ " 1777316400934 | \n",
+ " 2026-04-27 19:00:00.934 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " ETH-USD | \n",
+ " -0.000015 | \n",
+ " 1777312801025 | \n",
+ " 2026-04-27 18:00:01.025 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " ETH-USD | \n",
+ " -0.000007 | \n",
+ " 1777309201012 | \n",
+ " 2026-04-27 17:00:01.012 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " ETH-USD | \n",
+ " 0.000013 | \n",
+ " 1777305600343 | \n",
+ " 2026-04-27 16:00:00.343 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " market funding_rate timestamp timestamp_dt\n",
+ "0 ETH-USD -0.000023 1777348801028 2026-04-28 04:00:01.028\n",
+ "1 ETH-USD -0.000002 1777345201018 2026-04-28 03:00:01.018\n",
+ "2 ETH-USD 0.000003 1777341601019 2026-04-28 02:00:01.019\n",
+ "3 ETH-USD -0.000001 1777338001032 2026-04-28 01:00:01.032\n",
+ "4 ETH-USD 0.000011 1777334401026 2026-04-28 00:00:01.026\n",
+ "5 ETH-USD 0 1777330801011 2026-04-27 23:00:01.011\n",
+ "6 ETH-USD 0.000013 1777327200342 2026-04-27 22:00:00.342\n",
+ "7 ETH-USD -0.000003 1777323600342 2026-04-27 21:00:00.342\n",
+ "8 ETH-USD 0 1777320000722 2026-04-27 20:00:00.722\n",
+ "9 ETH-USD 0.000003 1777316400934 2026-04-27 19:00:00.934\n",
+ "10 ETH-USD -0.000015 1777312801025 2026-04-27 18:00:01.025\n",
+ "11 ETH-USD -0.000007 1777309201012 2026-04-27 17:00:01.012\n",
+ "12 ETH-USD 0.000013 1777305600343 2026-04-27 16:00:00.343"
+ ]
+ },
+ "execution_count": 200,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_fr_plot"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 208,
+ "id": "615f6b20",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "name": "Ratio",
+ "type": "scatter",
+ "x": [
+ "2026-04-27T15:25:00.000",
+ "2026-04-27T15:26:00.000",
+ "2026-04-27T15:27:00.000",
+ "2026-04-27T15:28:00.000",
+ "2026-04-27T15:29:00.000",
+ "2026-04-27T15:30:00.000",
+ "2026-04-27T15:31:00.000",
+ "2026-04-27T15:32:00.000",
+ "2026-04-27T15:33:00.000",
+ "2026-04-27T15:34:00.000",
+ "2026-04-27T15:35:00.000",
+ "2026-04-27T15:36:00.000",
+ "2026-04-27T15:37:00.000",
+ "2026-04-27T15:38:00.000",
+ "2026-04-27T15:39:00.000",
+ "2026-04-27T15:40:00.000",
+ "2026-04-27T15:41:00.000",
+ "2026-04-27T15:42:00.000",
+ "2026-04-27T15:43:00.000",
+ "2026-04-27T15:44:00.000",
+ "2026-04-27T15:45:00.000",
+ "2026-04-27T15:46:00.000",
+ "2026-04-27T15:47:00.000",
+ "2026-04-27T15:48:00.000",
+ "2026-04-27T15:49:00.000",
+ "2026-04-27T15:50:00.000",
+ "2026-04-27T15:51:00.000",
+ "2026-04-27T15:52:00.000",
+ "2026-04-27T15:53:00.000",
+ "2026-04-27T15:54:00.000",
+ "2026-04-27T15:55:00.000",
+ "2026-04-27T15:56:00.000",
+ "2026-04-27T15:57:00.000",
+ "2026-04-27T15:58:00.000",
+ "2026-04-27T15:59:00.000",
+ "2026-04-27T16:00:00.000",
+ "2026-04-27T16:01:00.000",
+ "2026-04-27T16:02:00.000",
+ "2026-04-27T16:03:00.000",
+ "2026-04-27T16:04:00.000",
+ "2026-04-27T16:05:00.000",
+ "2026-04-27T16:06:00.000",
+ "2026-04-27T16:07:00.000",
+ "2026-04-27T16:08:00.000",
+ "2026-04-27T16:09:00.000",
+ "2026-04-27T16:10:00.000",
+ "2026-04-27T16:11:00.000",
+ "2026-04-27T16:12:00.000",
+ "2026-04-27T16:13:00.000",
+ "2026-04-27T16:14:00.000",
+ "2026-04-27T16:15:00.000",
+ "2026-04-27T16:16:00.000",
+ "2026-04-27T16:17:00.000",
+ "2026-04-27T16:18:00.000",
+ "2026-04-27T16:19:00.000",
+ "2026-04-27T16:20:00.000",
+ "2026-04-27T16:21:00.000",
+ "2026-04-27T16:22:00.000",
+ "2026-04-27T16:23:00.000",
+ "2026-04-27T16:24:00.000",
+ "2026-04-27T16:25:00.000",
+ "2026-04-27T16:26:00.000",
+ "2026-04-27T16:27:00.000",
+ "2026-04-27T16:28:00.000",
+ "2026-04-27T16:29:00.000",
+ "2026-04-27T16:30:00.000",
+ "2026-04-27T16:31:00.000",
+ "2026-04-27T16:32:00.000",
+ "2026-04-27T16:33:00.000",
+ "2026-04-27T16:34:00.000",
+ "2026-04-27T16:35:00.000",
+ "2026-04-27T16:36:00.000",
+ "2026-04-27T16:38:00.000",
+ "2026-04-27T16:39:00.000",
+ "2026-04-27T16:40:00.000",
+ "2026-04-27T16:41:00.000",
+ "2026-04-27T16:43:00.000",
+ "2026-04-27T16:44:00.000",
+ "2026-04-27T16:45:00.000",
+ "2026-04-27T16:46:00.000",
+ "2026-04-27T16:47:00.000",
+ "2026-04-27T16:48:00.000",
+ "2026-04-27T16:49:00.000",
+ "2026-04-27T16:50:00.000",
+ "2026-04-27T16:51:00.000",
+ "2026-04-27T16:52:00.000",
+ "2026-04-27T16:53:00.000",
+ "2026-04-27T16:54:00.000",
+ "2026-04-27T16:55:00.000",
+ "2026-04-27T16:56:00.000",
+ "2026-04-27T16:57:00.000",
+ "2026-04-27T16:58:00.000",
+ "2026-04-27T17:00:00.000",
+ "2026-04-27T17:01:00.000",
+ "2026-04-27T17:02:00.000",
+ "2026-04-27T17:03:00.000",
+ "2026-04-27T17:04:00.000",
+ "2026-04-27T17:05:00.000",
+ "2026-04-27T17:06:00.000",
+ "2026-04-27T17:07:00.000",
+ "2026-04-27T17:08:00.000",
+ "2026-04-27T17:09:00.000",
+ "2026-04-27T17:10:00.000",
+ "2026-04-27T17:11:00.000",
+ "2026-04-27T17:12:00.000",
+ "2026-04-27T17:13:00.000",
+ "2026-04-27T17:14:00.000",
+ "2026-04-27T17:15:00.000",
+ "2026-04-27T17:16:00.000",
+ "2026-04-27T17:18:00.000",
+ "2026-04-27T17:19:00.000",
+ "2026-04-27T17:20:00.000",
+ "2026-04-27T17:23:00.000",
+ "2026-04-27T17:24:00.000",
+ "2026-04-27T17:25:00.000",
+ "2026-04-27T17:26:00.000",
+ "2026-04-27T17:27:00.000",
+ "2026-04-27T17:28:00.000",
+ "2026-04-27T17:29:00.000",
+ "2026-04-27T17:30:00.000",
+ "2026-04-27T17:31:00.000",
+ "2026-04-27T17:32:00.000",
+ "2026-04-27T17:33:00.000",
+ "2026-04-27T17:34:00.000",
+ "2026-04-27T17:35:00.000",
+ "2026-04-27T17:36:00.000",
+ "2026-04-27T17:37:00.000",
+ "2026-04-27T17:38:00.000",
+ "2026-04-27T17:39:00.000",
+ "2026-04-27T17:40:00.000",
+ "2026-04-27T17:41:00.000",
+ "2026-04-27T17:42:00.000",
+ "2026-04-27T17:43:00.000",
+ "2026-04-27T17:44:00.000",
+ "2026-04-27T17:45:00.000",
+ "2026-04-27T17:46:00.000",
+ "2026-04-27T17:47:00.000",
+ "2026-04-27T17:48:00.000",
+ "2026-04-27T17:49:00.000",
+ "2026-04-27T17:50:00.000",
+ "2026-04-27T17:51:00.000",
+ "2026-04-27T17:53:00.000",
+ "2026-04-27T17:54:00.000",
+ "2026-04-27T17:55:00.000",
+ "2026-04-27T17:56:00.000",
+ "2026-04-27T17:58:00.000",
+ "2026-04-27T18:00:00.000",
+ "2026-04-27T18:01:00.000",
+ "2026-04-27T18:02:00.000",
+ "2026-04-27T18:03:00.000",
+ "2026-04-27T18:04:00.000",
+ "2026-04-27T18:05:00.000",
+ "2026-04-27T18:06:00.000",
+ "2026-04-27T18:07:00.000",
+ "2026-04-27T18:08:00.000",
+ "2026-04-27T18:09:00.000",
+ "2026-04-27T18:10:00.000",
+ "2026-04-27T18:11:00.000",
+ "2026-04-27T18:12:00.000",
+ "2026-04-27T18:13:00.000",
+ "2026-04-27T18:14:00.000",
+ "2026-04-27T18:17:00.000",
+ "2026-04-27T18:18:00.000",
+ "2026-04-27T18:19:00.000",
+ "2026-04-27T18:20:00.000",
+ "2026-04-27T18:21:00.000",
+ "2026-04-27T18:23:00.000",
+ "2026-04-27T18:24:00.000",
+ "2026-04-27T18:25:00.000",
+ "2026-04-27T18:26:00.000",
+ "2026-04-27T18:28:00.000",
+ "2026-04-27T18:30:00.000",
+ "2026-04-27T18:31:00.000",
+ "2026-04-27T18:32:00.000",
+ "2026-04-27T18:33:00.000",
+ "2026-04-27T18:34:00.000",
+ "2026-04-27T18:35:00.000",
+ "2026-04-27T18:38:00.000",
+ "2026-04-27T18:39:00.000",
+ "2026-04-27T18:40:00.000",
+ "2026-04-27T18:41:00.000",
+ "2026-04-27T18:42:00.000",
+ "2026-04-27T18:43:00.000",
+ "2026-04-27T18:45:00.000",
+ "2026-04-27T18:46:00.000",
+ "2026-04-27T18:47:00.000",
+ "2026-04-27T18:48:00.000",
+ "2026-04-27T18:49:00.000",
+ "2026-04-27T18:50:00.000",
+ "2026-04-27T18:51:00.000",
+ "2026-04-27T18:52:00.000",
+ "2026-04-27T18:53:00.000",
+ "2026-04-27T18:54:00.000",
+ "2026-04-27T18:55:00.000",
+ "2026-04-27T18:56:00.000",
+ "2026-04-27T18:57:00.000",
+ "2026-04-27T18:58:00.000",
+ "2026-04-27T19:00:00.000",
+ "2026-04-27T19:01:00.000",
+ "2026-04-27T19:02:00.000",
+ "2026-04-27T19:03:00.000",
+ "2026-04-27T19:04:00.000",
+ "2026-04-27T19:05:00.000",
+ "2026-04-27T19:06:00.000",
+ "2026-04-27T19:07:00.000",
+ "2026-04-27T19:13:00.000",
+ "2026-04-27T19:14:00.000",
+ "2026-04-27T19:15:00.000",
+ "2026-04-27T19:16:00.000",
+ "2026-04-27T19:17:00.000",
+ "2026-04-27T19:18:00.000",
+ "2026-04-27T19:19:00.000",
+ "2026-04-27T19:20:00.000",
+ "2026-04-27T19:21:00.000",
+ "2026-04-27T19:22:00.000",
+ "2026-04-27T19:23:00.000",
+ "2026-04-27T19:24:00.000",
+ "2026-04-27T19:25:00.000",
+ "2026-04-27T19:26:00.000",
+ "2026-04-27T19:27:00.000",
+ "2026-04-27T19:28:00.000",
+ "2026-04-27T19:29:00.000",
+ "2026-04-27T19:30:00.000",
+ "2026-04-27T19:31:00.000",
+ "2026-04-27T19:32:00.000",
+ "2026-04-27T19:33:00.000",
+ "2026-04-27T19:35:00.000",
+ "2026-04-27T19:36:00.000",
+ "2026-04-27T19:37:00.000",
+ "2026-04-27T19:38:00.000",
+ "2026-04-27T19:39:00.000",
+ "2026-04-27T19:40:00.000",
+ "2026-04-27T19:41:00.000",
+ "2026-04-27T19:42:00.000",
+ "2026-04-27T19:43:00.000",
+ "2026-04-27T19:44:00.000",
+ "2026-04-27T19:45:00.000",
+ "2026-04-27T19:46:00.000",
+ "2026-04-27T19:47:00.000",
+ "2026-04-27T19:48:00.000",
+ "2026-04-27T19:49:00.000",
+ "2026-04-27T19:50:00.000",
+ "2026-04-27T19:51:00.000",
+ "2026-04-27T19:52:00.000",
+ "2026-04-27T19:55:00.000",
+ "2026-04-27T19:56:00.000",
+ "2026-04-27T19:57:00.000",
+ "2026-04-27T19:59:00.000",
+ "2026-04-27T20:00:00.000",
+ "2026-04-27T20:01:00.000",
+ "2026-04-27T20:03:00.000",
+ "2026-04-27T20:04:00.000",
+ "2026-04-27T20:05:00.000",
+ "2026-04-27T20:06:00.000",
+ "2026-04-27T20:07:00.000",
+ "2026-04-27T20:08:00.000",
+ "2026-04-27T20:09:00.000",
+ "2026-04-27T20:10:00.000",
+ "2026-04-27T20:11:00.000",
+ "2026-04-27T20:12:00.000",
+ "2026-04-27T20:13:00.000",
+ "2026-04-27T20:14:00.000",
+ "2026-04-27T20:15:00.000",
+ "2026-04-27T20:16:00.000",
+ "2026-04-27T20:17:00.000",
+ "2026-04-27T20:20:00.000",
+ "2026-04-27T20:21:00.000",
+ "2026-04-27T20:22:00.000",
+ "2026-04-27T20:26:00.000",
+ "2026-04-27T20:27:00.000",
+ "2026-04-27T20:30:00.000",
+ "2026-04-27T20:31:00.000",
+ "2026-04-27T20:32:00.000",
+ "2026-04-27T20:33:00.000",
+ "2026-04-27T20:34:00.000",
+ "2026-04-27T20:35:00.000",
+ "2026-04-27T20:36:00.000",
+ "2026-04-27T20:37:00.000",
+ "2026-04-27T20:38:00.000",
+ "2026-04-27T20:39:00.000",
+ "2026-04-27T20:40:00.000",
+ "2026-04-27T20:44:00.000",
+ "2026-04-27T20:45:00.000",
+ "2026-04-27T20:46:00.000",
+ "2026-04-27T20:52:00.000",
+ "2026-04-27T20:54:00.000",
+ "2026-04-27T20:58:00.000",
+ "2026-04-27T20:59:00.000",
+ "2026-04-27T21:00:00.000",
+ "2026-04-27T21:01:00.000",
+ "2026-04-27T21:02:00.000",
+ "2026-04-27T21:03:00.000",
+ "2026-04-27T21:04:00.000",
+ "2026-04-27T21:05:00.000",
+ "2026-04-27T21:06:00.000",
+ "2026-04-27T21:07:00.000",
+ "2026-04-27T21:08:00.000",
+ "2026-04-27T21:09:00.000",
+ "2026-04-27T21:10:00.000",
+ "2026-04-27T21:11:00.000",
+ "2026-04-27T21:12:00.000",
+ "2026-04-27T21:15:00.000",
+ "2026-04-27T21:16:00.000",
+ "2026-04-27T21:17:00.000",
+ "2026-04-27T21:18:00.000",
+ "2026-04-27T21:19:00.000",
+ "2026-04-27T21:20:00.000",
+ "2026-04-27T21:29:00.000",
+ "2026-04-27T21:30:00.000",
+ "2026-04-27T21:32:00.000",
+ "2026-04-27T21:33:00.000",
+ "2026-04-27T21:34:00.000",
+ "2026-04-27T21:36:00.000",
+ "2026-04-27T21:37:00.000",
+ "2026-04-27T21:38:00.000",
+ "2026-04-27T21:40:00.000",
+ "2026-04-27T21:41:00.000",
+ "2026-04-27T21:42:00.000",
+ "2026-04-27T21:43:00.000",
+ "2026-04-27T21:44:00.000",
+ "2026-04-27T21:45:00.000",
+ "2026-04-27T21:46:00.000",
+ "2026-04-27T21:47:00.000",
+ "2026-04-27T21:48:00.000",
+ "2026-04-27T21:50:00.000",
+ "2026-04-27T21:51:00.000",
+ "2026-04-27T21:52:00.000",
+ "2026-04-27T21:53:00.000",
+ "2026-04-27T21:54:00.000",
+ "2026-04-27T21:55:00.000",
+ "2026-04-27T21:56:00.000",
+ "2026-04-27T21:59:00.000",
+ "2026-04-27T22:00:00.000",
+ "2026-04-27T22:01:00.000",
+ "2026-04-27T22:02:00.000",
+ "2026-04-27T22:03:00.000",
+ "2026-04-27T22:04:00.000",
+ "2026-04-27T22:05:00.000",
+ "2026-04-27T22:06:00.000",
+ "2026-04-27T22:07:00.000",
+ "2026-04-27T22:08:00.000",
+ "2026-04-27T22:09:00.000",
+ "2026-04-27T22:10:00.000",
+ "2026-04-27T22:11:00.000",
+ "2026-04-27T22:12:00.000",
+ "2026-04-27T22:15:00.000",
+ "2026-04-27T22:16:00.000",
+ "2026-04-27T22:17:00.000",
+ "2026-04-27T22:20:00.000",
+ "2026-04-27T22:21:00.000",
+ "2026-04-27T22:23:00.000",
+ "2026-04-27T22:24:00.000",
+ "2026-04-27T22:28:00.000",
+ "2026-04-27T22:29:00.000",
+ "2026-04-27T22:30:00.000",
+ "2026-04-27T22:31:00.000",
+ "2026-04-27T22:32:00.000",
+ "2026-04-27T22:33:00.000",
+ "2026-04-27T22:34:00.000",
+ "2026-04-27T22:35:00.000",
+ "2026-04-27T22:36:00.000",
+ "2026-04-27T22:38:00.000",
+ "2026-04-27T22:44:00.000",
+ "2026-04-27T22:45:00.000",
+ "2026-04-27T22:48:00.000",
+ "2026-04-27T22:49:00.000",
+ "2026-04-27T22:50:00.000",
+ "2026-04-27T22:51:00.000",
+ "2026-04-27T22:52:00.000",
+ "2026-04-27T22:55:00.000",
+ "2026-04-27T22:56:00.000",
+ "2026-04-27T22:58:00.000",
+ "2026-04-27T22:59:00.000",
+ "2026-04-27T23:00:00.000",
+ "2026-04-27T23:02:00.000",
+ "2026-04-27T23:04:00.000",
+ "2026-04-27T23:05:00.000",
+ "2026-04-27T23:06:00.000",
+ "2026-04-27T23:07:00.000",
+ "2026-04-27T23:09:00.000",
+ "2026-04-27T23:10:00.000",
+ "2026-04-27T23:11:00.000",
+ "2026-04-27T23:12:00.000",
+ "2026-04-27T23:13:00.000",
+ "2026-04-27T23:16:00.000",
+ "2026-04-27T23:17:00.000",
+ "2026-04-27T23:18:00.000",
+ "2026-04-27T23:19:00.000",
+ "2026-04-27T23:20:00.000",
+ "2026-04-27T23:23:00.000",
+ "2026-04-27T23:24:00.000",
+ "2026-04-27T23:25:00.000",
+ "2026-04-27T23:26:00.000",
+ "2026-04-27T23:28:00.000",
+ "2026-04-27T23:29:00.000",
+ "2026-04-27T23:31:00.000",
+ "2026-04-27T23:32:00.000",
+ "2026-04-27T23:33:00.000",
+ "2026-04-27T23:35:00.000",
+ "2026-04-27T23:36:00.000",
+ "2026-04-27T23:37:00.000",
+ "2026-04-27T23:38:00.000",
+ "2026-04-27T23:39:00.000",
+ "2026-04-27T23:40:00.000",
+ "2026-04-27T23:41:00.000",
+ "2026-04-27T23:42:00.000",
+ "2026-04-27T23:43:00.000",
+ "2026-04-27T23:44:00.000",
+ "2026-04-27T23:45:00.000",
+ "2026-04-27T23:46:00.000",
+ "2026-04-27T23:47:00.000",
+ "2026-04-27T23:48:00.000",
+ "2026-04-27T23:49:00.000",
+ "2026-04-27T23:50:00.000",
+ "2026-04-27T23:51:00.000",
+ "2026-04-27T23:52:00.000",
+ "2026-04-27T23:53:00.000",
+ "2026-04-27T23:54:00.000",
+ "2026-04-27T23:55:00.000",
+ "2026-04-27T23:56:00.000",
+ "2026-04-27T23:57:00.000",
+ "2026-04-27T23:58:00.000",
+ "2026-04-28T00:00:00.000",
+ "2026-04-28T00:01:00.000",
+ "2026-04-28T00:03:00.000",
+ "2026-04-28T00:04:00.000",
+ "2026-04-28T00:05:00.000",
+ "2026-04-28T00:06:00.000",
+ "2026-04-28T00:07:00.000",
+ "2026-04-28T00:09:00.000",
+ "2026-04-28T00:10:00.000",
+ "2026-04-28T00:11:00.000",
+ "2026-04-28T00:12:00.000",
+ "2026-04-28T00:13:00.000",
+ "2026-04-28T00:14:00.000",
+ "2026-04-28T00:15:00.000",
+ "2026-04-28T00:16:00.000",
+ "2026-04-28T00:17:00.000",
+ "2026-04-28T00:18:00.000",
+ "2026-04-28T00:19:00.000",
+ "2026-04-28T00:20:00.000",
+ "2026-04-28T00:21:00.000",
+ "2026-04-28T00:23:00.000",
+ "2026-04-28T00:24:00.000",
+ "2026-04-28T00:26:00.000",
+ "2026-04-28T00:27:00.000",
+ "2026-04-28T00:28:00.000",
+ "2026-04-28T00:30:00.000",
+ "2026-04-28T00:33:00.000",
+ "2026-04-28T00:34:00.000",
+ "2026-04-28T00:35:00.000",
+ "2026-04-28T00:37:00.000",
+ "2026-04-28T00:39:00.000",
+ "2026-04-28T00:40:00.000",
+ "2026-04-28T00:41:00.000",
+ "2026-04-28T00:42:00.000",
+ "2026-04-28T00:43:00.000",
+ "2026-04-28T00:44:00.000",
+ "2026-04-28T00:45:00.000",
+ "2026-04-28T00:46:00.000",
+ "2026-04-28T00:47:00.000",
+ "2026-04-28T00:48:00.000",
+ "2026-04-28T00:49:00.000",
+ "2026-04-28T00:50:00.000",
+ "2026-04-28T00:51:00.000",
+ "2026-04-28T00:52:00.000",
+ "2026-04-28T00:56:00.000",
+ "2026-04-28T00:57:00.000",
+ "2026-04-28T00:58:00.000",
+ "2026-04-28T00:59:00.000",
+ "2026-04-28T01:00:00.000",
+ "2026-04-28T01:02:00.000",
+ "2026-04-28T01:04:00.000",
+ "2026-04-28T01:06:00.000",
+ "2026-04-28T01:07:00.000",
+ "2026-04-28T01:08:00.000",
+ "2026-04-28T01:09:00.000",
+ "2026-04-28T01:10:00.000",
+ "2026-04-28T01:11:00.000",
+ "2026-04-28T01:12:00.000",
+ "2026-04-28T01:13:00.000",
+ "2026-04-28T01:14:00.000",
+ "2026-04-28T01:15:00.000",
+ "2026-04-28T01:16:00.000",
+ "2026-04-28T01:17:00.000",
+ "2026-04-28T01:18:00.000",
+ "2026-04-28T01:19:00.000",
+ "2026-04-28T01:20:00.000",
+ "2026-04-28T01:21:00.000",
+ "2026-04-28T01:22:00.000",
+ "2026-04-28T01:23:00.000",
+ "2026-04-28T01:24:00.000",
+ "2026-04-28T01:25:00.000",
+ "2026-04-28T01:26:00.000",
+ "2026-04-28T01:27:00.000",
+ "2026-04-28T01:28:00.000",
+ "2026-04-28T01:29:00.000",
+ "2026-04-28T01:30:00.000",
+ "2026-04-28T01:31:00.000",
+ "2026-04-28T01:32:00.000",
+ "2026-04-28T01:33:00.000",
+ "2026-04-28T01:34:00.000",
+ "2026-04-28T01:35:00.000",
+ "2026-04-28T01:36:00.000",
+ "2026-04-28T01:37:00.000",
+ "2026-04-28T01:38:00.000",
+ "2026-04-28T01:39:00.000",
+ "2026-04-28T01:40:00.000",
+ "2026-04-28T01:41:00.000",
+ "2026-04-28T01:42:00.000",
+ "2026-04-28T01:43:00.000",
+ "2026-04-28T01:44:00.000",
+ "2026-04-28T01:45:00.000",
+ "2026-04-28T01:46:00.000",
+ "2026-04-28T01:47:00.000",
+ "2026-04-28T01:48:00.000",
+ "2026-04-28T01:49:00.000",
+ "2026-04-28T01:50:00.000",
+ "2026-04-28T01:51:00.000",
+ "2026-04-28T01:52:00.000",
+ "2026-04-28T01:53:00.000",
+ "2026-04-28T01:54:00.000",
+ "2026-04-28T01:55:00.000",
+ "2026-04-28T01:56:00.000",
+ "2026-04-28T01:57:00.000",
+ "2026-04-28T01:58:00.000",
+ "2026-04-28T01:59:00.000",
+ "2026-04-28T02:00:00.000",
+ "2026-04-28T02:01:00.000",
+ "2026-04-28T02:02:00.000",
+ "2026-04-28T02:03:00.000",
+ "2026-04-28T02:04:00.000",
+ "2026-04-28T02:05:00.000",
+ "2026-04-28T02:06:00.000",
+ "2026-04-28T02:07:00.000",
+ "2026-04-28T02:09:00.000",
+ "2026-04-28T02:10:00.000",
+ "2026-04-28T02:12:00.000",
+ "2026-04-28T02:15:00.000",
+ "2026-04-28T02:16:00.000",
+ "2026-04-28T02:17:00.000",
+ "2026-04-28T02:19:00.000",
+ "2026-04-28T02:20:00.000",
+ "2026-04-28T02:22:00.000",
+ "2026-04-28T02:24:00.000",
+ "2026-04-28T02:25:00.000",
+ "2026-04-28T02:26:00.000",
+ "2026-04-28T02:27:00.000",
+ "2026-04-28T02:28:00.000",
+ "2026-04-28T02:29:00.000",
+ "2026-04-28T02:30:00.000",
+ "2026-04-28T02:31:00.000",
+ "2026-04-28T02:32:00.000",
+ "2026-04-28T02:33:00.000",
+ "2026-04-28T02:34:00.000",
+ "2026-04-28T02:35:00.000",
+ "2026-04-28T02:36:00.000",
+ "2026-04-28T02:37:00.000",
+ "2026-04-28T02:38:00.000",
+ "2026-04-28T02:39:00.000",
+ "2026-04-28T02:40:00.000",
+ "2026-04-28T02:41:00.000",
+ "2026-04-28T02:42:00.000",
+ "2026-04-28T02:43:00.000",
+ "2026-04-28T02:44:00.000",
+ "2026-04-28T02:45:00.000",
+ "2026-04-28T02:46:00.000",
+ "2026-04-28T02:48:00.000",
+ "2026-04-28T02:49:00.000",
+ "2026-04-28T02:50:00.000",
+ "2026-04-28T02:51:00.000",
+ "2026-04-28T02:52:00.000",
+ "2026-04-28T02:53:00.000",
+ "2026-04-28T02:54:00.000",
+ "2026-04-28T02:55:00.000",
+ "2026-04-28T02:57:00.000",
+ "2026-04-28T02:58:00.000",
+ "2026-04-28T02:59:00.000",
+ "2026-04-28T03:00:00.000",
+ "2026-04-28T03:01:00.000",
+ "2026-04-28T03:02:00.000",
+ "2026-04-28T03:03:00.000",
+ "2026-04-28T03:04:00.000",
+ "2026-04-28T03:05:00.000",
+ "2026-04-28T03:06:00.000",
+ "2026-04-28T03:07:00.000",
+ "2026-04-28T03:08:00.000",
+ "2026-04-28T03:09:00.000",
+ "2026-04-28T03:10:00.000",
+ "2026-04-28T03:11:00.000",
+ "2026-04-28T03:12:00.000",
+ "2026-04-28T03:13:00.000",
+ "2026-04-28T03:15:00.000",
+ "2026-04-28T03:17:00.000",
+ "2026-04-28T03:18:00.000",
+ "2026-04-28T03:19:00.000",
+ "2026-04-28T03:20:00.000",
+ "2026-04-28T03:22:00.000",
+ "2026-04-28T03:23:00.000",
+ "2026-04-28T03:24:00.000",
+ "2026-04-28T03:26:00.000",
+ "2026-04-28T03:28:00.000",
+ "2026-04-28T03:29:00.000",
+ "2026-04-28T03:30:00.000",
+ "2026-04-28T03:31:00.000",
+ "2026-04-28T03:34:00.000",
+ "2026-04-28T03:35:00.000",
+ "2026-04-28T03:36:00.000",
+ "2026-04-28T03:37:00.000",
+ "2026-04-28T03:38:00.000",
+ "2026-04-28T03:39:00.000",
+ "2026-04-28T03:40:00.000",
+ "2026-04-28T03:41:00.000",
+ "2026-04-28T03:44:00.000",
+ "2026-04-28T03:45:00.000",
+ "2026-04-28T03:46:00.000",
+ "2026-04-28T03:50:00.000",
+ "2026-04-28T03:51:00.000",
+ "2026-04-28T03:54:00.000",
+ "2026-04-28T03:57:00.000",
+ "2026-04-28T04:01:00.000",
+ "2026-04-28T04:02:00.000",
+ "2026-04-28T04:06:00.000"
+ ],
+ "y": {
+ "bdata": "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",
+ "dtype": "f8"
+ }
+ },
+ {
+ "name": "FR",
+ "type": "scatter",
+ "x": [
+ "2026-04-28T04:00:01.028",
+ "2026-04-28T03:00:01.018",
+ "2026-04-28T02:00:01.019",
+ "2026-04-28T01:00:01.032",
+ "2026-04-28T00:00:01.026",
+ "2026-04-27T23:00:01.011",
+ "2026-04-27T22:00:00.342",
+ "2026-04-27T21:00:00.342",
+ "2026-04-27T20:00:00.722",
+ "2026-04-27T19:00:00.934",
+ "2026-04-27T18:00:01.025",
+ "2026-04-27T17:00:01.012",
+ "2026-04-27T16:00:00.343"
+ ],
+ "y": [
+ "-0.000023",
+ "-0.000002",
+ "0.000003",
+ "-0.000001",
+ "0.000011",
+ "0",
+ "0.000013",
+ "-0.000003",
+ "0",
+ "0.000003",
+ "-0.000015",
+ "-0.000007",
+ "0.000013"
+ ],
+ "yaxis": "y2"
+ }
+ ],
+ "layout": {
+ "shapes": [
+ {
+ "label": {
+ "font": {
+ "color": "white",
+ "size": 16
+ },
+ "text": "^ Ratio_Buy",
+ "textposition": "end"
+ },
+ "line": {
+ "color": "white",
+ "dash": "dot"
+ },
+ "type": "line",
+ "x0": 0,
+ "x1": 1,
+ "xref": "x domain",
+ "y0": 1,
+ "y1": 1,
+ "yref": "y"
+ }
+ ],
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#f2f5fa"
+ },
+ "error_y": {
+ "color": "#f2f5fa"
+ },
+ "marker": {
+ "line": {
+ "color": "rgb(17,17,17)",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "rgb(17,17,17)",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#A2B1C6",
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "minorgridcolor": "#506784",
+ "startlinecolor": "#A2B1C6"
+ },
+ "baxis": {
+ "endlinecolor": "#A2B1C6",
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "minorgridcolor": "#506784",
+ "startlinecolor": "#A2B1C6"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "marker": {
+ "line": {
+ "color": "#283442"
+ }
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "line": {
+ "color": "#283442"
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermap": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermap"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#506784"
+ },
+ "line": {
+ "color": "rgb(17,17,17)"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#2a3f5f"
+ },
+ "line": {
+ "color": "rgb(17,17,17)"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#f2f5fa",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#f2f5fa"
+ },
+ "geo": {
+ "bgcolor": "rgb(17,17,17)",
+ "lakecolor": "rgb(17,17,17)",
+ "landcolor": "rgb(17,17,17)",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#506784"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "dark"
+ },
+ "paper_bgcolor": "rgb(17,17,17)",
+ "plot_bgcolor": "rgb(17,17,17)",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "bgcolor": "rgb(17,17,17)",
+ "radialaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ },
+ "yaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ },
+ "zaxis": {
+ "backgroundcolor": "rgb(17,17,17)",
+ "gridcolor": "#506784",
+ "gridwidth": 2,
+ "linecolor": "#506784",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#C8D4E3"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#f2f5fa"
+ }
+ },
+ "sliderdefaults": {
+ "bgcolor": "#C8D4E3",
+ "bordercolor": "rgb(17,17,17)",
+ "borderwidth": 1,
+ "tickwidth": 0
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ },
+ "bgcolor": "rgb(17,17,17)",
+ "caxis": {
+ "gridcolor": "#506784",
+ "linecolor": "#506784",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "updatemenudefaults": {
+ "bgcolor": "#506784",
+ "borderwidth": 0
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#283442",
+ "linecolor": "#506784",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#283442",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#283442",
+ "linecolor": "#506784",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#283442",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "yaxis": {
+ "side": "right",
+ "title": {
+ "text": "Ratio"
+ }
+ },
+ "yaxis2": {
+ "overlaying": "y",
+ "side": "left",
+ "title": {
+ "text": "Funding Rate"
+ }
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "\n",
+ "# Add traces bound to different Y-axes\n",
+ "fig.add_trace(go.Scatter(x=df_comb_trades_by_sec_plot.index, y=df_comb_trades_by_sec_plot['ratio'], name=\"Ratio\")) # Funding Rate\n",
+ "fig.add_trace(go.Scatter(x=df_fr_plot['timestamp_dt'], y=df_fr_plot['funding_rate'], name=\"FR\", yaxis='y2')) # Ratio\n",
+ "# fig.add_trace(go.Scatter(x=[1, 2, 3], y=[400, 500, 600], name=\"Y3\", yaxis='y3')) # \n",
+ "\n",
+ "fig.update_layout(\n",
+ " yaxis=dict(title=\"Ratio\", side=\"right\"),\n",
+ " yaxis2=dict(title=\"Funding Rate\", side=\"left\", overlaying=\"y\",),\n",
+ " template='plotly_dark'\n",
+ " # yaxis3=dict(title=\"Tertiary Y (Right)\", overlaying=\"y\", side=\"right\", position=0.8)\n",
+ ")\n",
+ "\n",
+ "fig.add_hline(\n",
+ " y=1, \n",
+ " line_dash=\"dot\", \n",
+ " line_color=\"white\",\n",
+ " label=dict(\n",
+ " text=\"^ Ratio_Buy\",\n",
+ " textposition=\"end\",\n",
+ " font=dict(size=16, color=\"white\")\n",
+ " )\n",
+ ")\n",
+ "\n",
+ "# Create a range of hours\n",
+ "start_time = int(min_time)\n",
+ "end_time = (datetime.now().timestamp())\n",
+ "hours = pd.date_range(start=start_time, end=end_time, freq='h')\n",
+ "# Add a vertical line for each hour\n",
+ "for hour in hours:\n",
+ " fig.add_vline(x=hour.strftime('%Y-%m-%d %H:%M:%S'), \n",
+ " line=dict(color=\"gray\", width=1), \n",
+ " opacity=0.5)\n",
+ "fig.show()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8c976ebe",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "py_313",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.13.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/extended.ipynb b/extended.ipynb
index f6e77b6..eafea0b 100644
--- a/extended.ipynb
+++ b/extended.ipynb
@@ -27,7 +27,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"id": "ff971ca9",
"metadata": {},
"outputs": [],
@@ -44,7 +44,7 @@
"ORDER_MARKET = \"ETH-USD\"\n",
"ORDER_SIDE = OrderSide.BUY\n",
"ORDER_QTY = Decimal(\"0.01\")\n",
- "ORDER_PRICE = Decimal(\"2200\")"
+ "ORDER_PRICE = Decimal(\"2200.1\")"
]
},
{
@@ -59,10 +59,33 @@
},
{
"cell_type": "code",
- "execution_count": 41,
+ "execution_count": 4,
"id": "c366706f",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Error response from https://api.starknet.extended.exchange/api/v1/user/order: {\"status\":\"ERROR\",\"error\":{\"code\":1125,\"message\":\"Invalid price precision\"}}\n"
+ ]
+ },
+ {
+ "ename": "ValueError",
+ "evalue": "Error response from https://api.starknet.extended.exchange/api/v1/user/order: code 400 - {\"status\":\"ERROR\",\"error\":{\"code\":1125,\"message\":\"Invalid price precision\"}}",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
+ "\u001b[31mValueError\u001b[39m Traceback (most recent call last)",
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m placed_order = await trading_client.place_order(\n\u001b[32m 2\u001b[39m market_name=ORDER_MARKET,\n\u001b[32m 3\u001b[39m amount_of_synthetic=ORDER_QTY,\n\u001b[32m 4\u001b[39m price=ORDER_PRICE,\n",
+ "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/py_313/lib/python3.13/site-packages/x10/perpetual/trading_client/trading_client.py:101\u001b[39m, in \u001b[36mPerpetualTradingClient.place_order\u001b[39m\u001b[34m(self, market_name, amount_of_synthetic, price, side, taker_fee, post_only, previous_order_id, expire_time, time_in_force, self_trade_protection_level, external_id, builder_fee, builder_id, reduce_only, tp_sl_type, take_profit, stop_loss)\u001b[39m\n\u001b[32m 78\u001b[39m expire_time = utc_now() + timedelta(hours=\u001b[32m1\u001b[39m)\n\u001b[32m 80\u001b[39m order = create_order_object(\n\u001b[32m 81\u001b[39m account=\u001b[38;5;28mself\u001b[39m.__stark_account,\n\u001b[32m 82\u001b[39m market=market,\n\u001b[32m (...)\u001b[39m\u001b[32m 99\u001b[39m stop_loss=stop_loss,\n\u001b[32m 100\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m101\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.__order_management_module.place_order(order)\n",
+ "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/py_313/lib/python3.13/site-packages/x10/perpetual/trading_client/order_management_module.py:31\u001b[39m, in \u001b[36mOrderManagementModule.place_order\u001b[39m\u001b[34m(self, order)\u001b[39m\n\u001b[32m 28\u001b[39m LOGGER.debug(\u001b[33m\"\u001b[39m\u001b[33mPlacing an order: id=\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m, order.id)\n\u001b[32m 30\u001b[39m url = \u001b[38;5;28mself\u001b[39m._get_url(\u001b[33m\"\u001b[39m\u001b[33m/user/order\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m---> \u001b[39m\u001b[32m31\u001b[39m response = \u001b[38;5;28;01mawait\u001b[39;00m send_post_request(\n\u001b[32m 32\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.get_session(),\n\u001b[32m 33\u001b[39m url,\n\u001b[32m 34\u001b[39m PlacedOrderModel,\n\u001b[32m 35\u001b[39m json=order.to_api_request_json(exclude_none=\u001b[38;5;28;01mTrue\u001b[39;00m),\n\u001b[32m 36\u001b[39m api_key=\u001b[38;5;28mself\u001b[39m._get_api_key(),\n\u001b[32m 37\u001b[39m )\n\u001b[32m 38\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m response\n",
+ "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/py_313/lib/python3.13/site-packages/x10/utils/http.py:173\u001b[39m, in \u001b[36msend_post_request\u001b[39m\u001b[34m(session, url, model_class, json, api_key, request_headers, response_code_to_exception)\u001b[39m\n\u001b[32m 171\u001b[39m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mwith\u001b[39;00m session.post(url, json=json, headers=headers) \u001b[38;5;28;01mas\u001b[39;00m response:\n\u001b[32m 172\u001b[39m response_text = \u001b[38;5;28;01mawait\u001b[39;00m response.text()\n\u001b[32m--> \u001b[39m\u001b[32m173\u001b[39m \u001b[30;43mhandle_known_errors\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43murl\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mresponse_code_to_exception\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mresponse\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mresponse_text\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 174\u001b[39m response_model = parse_response_to_model(response_text, model_class)\n\u001b[32m 176\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (response_model.status != ResponseStatus.OK) \u001b[38;5;129;01mor\u001b[39;00m (response_model.error \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m):\n",
+ "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/py_313/lib/python3.13/site-packages/x10/utils/http.py:243\u001b[39m, in \u001b[36mhandle_known_errors\u001b[39m\u001b[34m(url, response_code_handler, response, response_text)\u001b[39m\n\u001b[32m 241\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m response.status > \u001b[32m299\u001b[39m:\n\u001b[32m 242\u001b[39m LOGGER.error(\u001b[33m\"\u001b[39m\u001b[33mError response from \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m, url, response_text)\n\u001b[32m--> \u001b[39m\u001b[32m243\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mError response from \u001b[39m\u001b[38;5;132;01m{\u001b[39;00murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: code \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mresponse.status\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m - \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mresponse_text\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n",
+ "\u001b[31mValueError\u001b[39m: Error response from https://api.starknet.extended.exchange/api/v1/user/order: code 400 - {\"status\":\"ERROR\",\"error\":{\"code\":1125,\"message\":\"Invalid price precision\"}}"
+ ]
+ }
+ ],
"source": [
"placed_order = await trading_client.place_order(\n",
" market_name=ORDER_MARKET,\n",
@@ -70,7 +93,7 @@
" price=ORDER_PRICE,\n",
" side=ORDER_SIDE,\n",
" taker_fee=Decimal(\"0.00025\"),\n",
- " previous_order_id='1295034892466447624365619416628580523728221205816494340545831832663414858661'\n",
+ " # previous_order_id='1295034892466447624365619416628580523728221205816494340545831832663414858661'\n",
")"
]
},
@@ -789,7 +812,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.13.12"
+ "version": "3.13.13"
}
},
"nbformat": 4,
diff --git a/main.py b/main.py
index 6ab8d70..0f16b00 100644
--- a/main.py
+++ b/main.py
@@ -350,11 +350,13 @@ async def run_algo():
logging.info(f'ASTER ORDER PARTIALLY FILLED: {order_id}')
await get_aster_collateral()
await get_aster_notional_position()
+ utils.send_tg_alert(f'FR_ALGO - ASTER PARTIALLY FILLED ({order_id})')
elif order_update_status in ['FILLED']:
logging.info(f'ASTER ORDER FILLED: {order_id}')
ASTER_OPEN_ORDERS.pop(idx)
await get_aster_collateral()
await get_aster_notional_position()
+ utils.send_tg_alert(f'FR_ALGO - ASTER FILLED ({order_id})')
else:
logging.critical(f'EXTEND ORDER STATUS CHG TO UNEXPECTED VALUE, KILLING... ({order_id}): {order_orig_status} -> {order_update_status}')
if EXTEND_WS_ORDER_UPDATES is not None:
@@ -379,11 +381,13 @@ async def run_algo():
logging.info(f'EXTEND ORDER PARTIALLY FILLED: {order_id}')
await get_extend_collateral()
await get_extend_notional()
+ utils.send_tg_alert(f'FR_ALGO - EXTEND PARTIALLY FILLED ({order_id})')
elif order_update_status in ['FILLED']:
logging.info(f'EXTEND ORDER FILLED: {order_id}')
EXTEND_OPEN_ORDERS.pop(idx)
await get_extend_collateral()
await get_extend_notional()
+ utils.send_tg_alert(f'FR_ALGO - EXTEND FILLED ({order_id})')
else:
logging.critical(f'EXTEND ORDER STATUS CHG TO UNEXPECTED VALUE, KILLING... ({order_id}): {order_orig_status} -> {order_update_status}')
@@ -414,10 +418,18 @@ async def run_algo():
return EXTEND_FUND_RATE
NEXT_NET_FUNDING_RATE = calc_next_net_fund_rate(FUNDINGS_AT_SAME_TIME_NEXT_HR)
- Flags.NET_FUNDING_IS_ZERO = NEXT_NET_FUNDING_RATE == 0.00
- if Flags.NET_FUNDING_IS_ZERO:
- logging.info('NET FUNDING = 0.00; Cancelling Open Orders; Wait Until Non-Zero.')
+ Flags.NET_FUNDING_IS_ZERO = ( NEXT_NET_FUNDING_RATE >= ( (ALGO_CONFIG.Min_Fund_Rate_Pct_To_Trade*-1) / 100) ) and ( NEXT_NET_FUNDING_RATE <= ( ALGO_CONFIG.Min_Fund_Rate_Pct_To_Trade / 100 ) )
+ if Flags.NET_FUNDING_IS_ZERO or ALGO_CONFIG.Flatten_Open_Positions:
ALPHA_TGT_NOTIONAL = 0.00
+ # if ASTER_OPEN_ORDERS or EXTEND_OPEN_ORDERS:
+ # logging.info('NET FUNDING = 0.00; Cancelling Open Orders! then Waiting...')
+ # aster_cancel_all_orders()
+ # extend_cancel_all_orders()
+ # time.sleep(5)
+ # else:
+ # logging.info('NET FUNDING = 0.00; NO OPEN ORDERS; Waiting...')
+ # time.sleep(5)
+
if ALPHA_EXCH == 'EXTEND':
ASTER_TGT_NOTIONAL = ALPHA_TGT_NOTIONAL*-1
@@ -425,19 +437,38 @@ async def run_algo():
if ALPHA_CARRY_SIDE == 'BUY':
ASTER_TOB_PX = float(ASTER_TICKER_DICT['best_ask_px'])
EXTEND_TOB_PX = float(EXTENDED_TICKER_DICT['best_bid_px'])
+ Alpha_Nominator = ASTER_TOB_PX
+ Alpha_Denominator = EXTEND_TOB_PX
+ ALPHA_RATIO = ASTER_TOB_PX / EXTEND_TOB_PX
+ Expected_Alpha = ( ( ASTER_TOB_PX - EXTEND_TOB_PX ) / (( ASTER_TOB_PX + EXTEND_TOB_PX ) / 2) )
else:
ASTER_TOB_PX = float(ASTER_TICKER_DICT['best_bid_px'])
EXTEND_TOB_PX = float(EXTENDED_TICKER_DICT['best_ask_px'])
+ Alpha_Nominator = EXTEND_TOB_PX
+ Alpha_Denominator = ASTER_TOB_PX
+ ALPHA_RATIO = EXTEND_TOB_PX / ASTER_TOB_PX
+ Expected_Alpha = ( ( EXTEND_TOB_PX - ASTER_TOB_PX ) / (( ASTER_TOB_PX + EXTEND_TOB_PX ) / 2) )
else:
ASTER_TGT_NOTIONAL = ALPHA_TGT_NOTIONAL
EXTEND_TGT_NOTIONAL = ALPHA_TGT_NOTIONAL*-1
if ALPHA_CARRY_SIDE == 'BUY':
ASTER_TOB_PX = float(ASTER_TICKER_DICT['best_bid_px'])
EXTEND_TOB_PX = float(EXTENDED_TICKER_DICT['best_ask_px'])
+ Alpha_Nominator = EXTEND_TOB_PX
+ Alpha_Denominator = ASTER_TOB_PX
+ ALPHA_RATIO = EXTEND_TOB_PX / ASTER_TOB_PX
+ Expected_Alpha = ( ( EXTEND_TOB_PX - ASTER_TOB_PX ) / (( EXTEND_TOB_PX + ASTER_TOB_PX ) / 2) )
else:
ASTER_TOB_PX = float(ASTER_TICKER_DICT['best_ask_px'])
EXTEND_TOB_PX = float(EXTENDED_TICKER_DICT['best_bid_px'])
+ Alpha_Nominator = ASTER_TOB_PX
+ Alpha_Denominator = EXTEND_TOB_PX
+ ALPHA_RATIO = ASTER_TOB_PX / EXTEND_TOB_PX
+ Expected_Alpha = ( ( ASTER_TOB_PX - EXTEND_TOB_PX ) / (( ASTER_TOB_PX + EXTEND_TOB_PX ) / 2) )
+ Expected_Alpha_Net_FR = abs(NEXT_NET_FUNDING_RATE) + Expected_Alpha
+ Expected_Alpha_Net_FR_w_Taker = Expected_Alpha_Net_FR-0.0002
+ Expected_Alpha_w_Taker = Expected_Alpha-0.0002
ASTER_TGT_TAIL = ASTER_TGT_NOTIONAL - ( float(ASTER_NOTIONAL_POSITION) + float(ASTER_UNREALIZED_PNL) )
EXTEND_TGT_TAIL = EXTEND_TGT_NOTIONAL - ( float(EXTEND_NOTIONAL_POSITION) + float(EXTEND_UNREALIZED_PNL) )
@@ -455,22 +486,26 @@ async def run_algo():
OUT(f'''
LOOP SLEEP (SEC): {ALGO_CONFIG.Loop_Sleep_Sec}
- FLIP SIDES FOR TESTING?: {ALGO_CONFIG.Flip_Side_For_Testing}
+ FLIP SIDES FOR TESTING?: {ALGO_CONFIG.Flip_Side_For_Testing}; ASTER ORDER ENABLED? {ALGO_CONFIG.Allow_Ordering_Aster}; EXTEND ORDER ENABLED? {ALGO_CONFIG.Allow_Ordering_Extend}
{pd.to_datetime(ASTER_FUND_RATE_TIME, unit='ms')} ({(pd.to_datetime(ASTER_FUND_RATE_TIME, unit='ms')-datetime.now()):}) | {pd.to_datetime(EXTEND_FUND_RATE_TIME, unit='ms')} ({(pd.to_datetime(EXTEND_FUND_RATE_TIME, unit='ms')-datetime.now()):})
ASTER: {ASTER_FUND_RATE:.6%} [{ASTER_FUND_RATE*10_000:.2f}bps] [{ASTER_FUND_RATE*1_000_000:.0f}pips] | EXTEND: {EXTEND_FUND_RATE:.6%} [{EXTEND_FUND_RATE*10_000:.2f}bps] [{EXTEND_FUND_RATE*1_000_000:.0f}pips]
ASTER: {'LONG PAYS SHORT' if ASTER_FUND_RATE > 0 else 'SHORT PAYS LONG'} | EXTEND: {'LONG PAYS SHORT' if EXTEND_FUND_RATE > 0 else 'SHORT PAYS LONG'}
ASTER: [ Available Collateral: {ASTER_AVAIL_COLLATERAL:.4f} ] | EXTEND: [ Available Collateral: {EXTEND_AVAIL_COLLATERAL:.4f} ]
- ASTER: [ Notional Position $ : {ASTER_NOTIONAL_POSITION:.4f} ] | EXTEND: [ Notional Position $ : {EXTEND_NOTIONAL_POSITION:.4f} ]
+ ASTER: [ Notional Position $ : {ASTER_NOTIONAL_POSITION:.4f} ] | EXTEND: [ Notional Position $ : {EXTEND_NOTIONAL_POSITION:.4f} ]
SAME TIME? : {FUNDINGS_AT_SAME_TIME_NEXT_HR} [ Minutes Between Fundings: {min_between_fundings} ]
- NET FUNDING : {NEXT_NET_FUNDING_RATE:.6%} [{NEXT_NET_FUNDING_RATE*10_000:.2f}bps] [{NEXT_NET_FUNDING_RATE*1_000_000:.0f}pips]; Is Zero?: {Flags.NET_FUNDING_IS_ZERO}
+ NET FUNDING : {NEXT_NET_FUNDING_RATE:.6%} [{NEXT_NET_FUNDING_RATE*10_000:.2f}bps] [{NEXT_NET_FUNDING_RATE*1_000_000:.0f}pips]; Is Zero?: {Flags.NET_FUNDING_IS_ZERO} [Min: {ALGO_CONFIG.Min_Fund_Rate_Pct_To_Trade}]
ALPHA SIDE : {ALPHA_EXCH} [{ALPHA_CARRY_SIDE}]
- TGT NOTIONAL: $ {ALGO_CONFIG.Max_Target_Notional if not Flags.NET_FUNDING_IS_ZERO else 0.00}
+ TGT NOTIONAL: $ {ALGO_CONFIG.Max_Target_Notional if not Flags.NET_FUNDING_IS_ZERO else 0.00}; Flatten Open Positions Flag? {ALGO_CONFIG.Flatten_Open_Positions}
ASTER: {ASTER_NOTIONAL_POSITION:.4f} -> {ASTER_TGT_NOTIONAL:.2f} [ Remain: {ASTER_TGT_TAIL:.4f} ] | EXTEND: {EXTEND_NOTIONAL_POSITION:.4f} -> {EXTEND_TGT_NOTIONAL:.2f} [ Remain: {EXTEND_TGT_TAIL:.4f} ]
- ASTER: {ASTER_TGT_NOTIONAL:.2f} - {ASTER_NOTIONAL_POSITION:.2f} + {ASTER_UNREALIZED_PNL:.2f} = {ASTER_TGT_TAIL:2f} | EXTEND: {EXTEND_TGT_NOTIONAL:.2f} - {EXTEND_NOTIONAL_POSITION:.2f} + {EXTEND_UNREALIZED_PNL:.2f} = {EXTEND_TGT_TAIL:2f}
- ASTER: {ASTER_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {ASTER_TGT_TAIL_ORDERABLE} ] | EXTEND: {EXTEND_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {EXTEND_TGT_TAIL_ORDERABLE} ]
+ ASTER: {ASTER_TGT_NOTIONAL:.2f} - {ASTER_NOTIONAL_POSITION:.2f} + {ASTER_UNREALIZED_PNL:.2f} = {ASTER_TGT_TAIL:2f} | EXTEND: {EXTEND_TGT_NOTIONAL:.2f} - {EXTEND_NOTIONAL_POSITION:.2f} + {EXTEND_UNREALIZED_PNL:.2f} = {EXTEND_TGT_TAIL:2f}
+ ASTER: {ASTER_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {ASTER_TGT_TAIL_ORDERABLE} ] | EXTEND: {EXTEND_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {EXTEND_TGT_TAIL_ORDERABLE} ]
+
+ ALPHA: {ALPHA_RATIO:.8f} ALPHA_RATIO: {Alpha_Nominator:_.2f} / {Alpha_Denominator:_.2f}; Expected_Alpha = {Expected_Alpha:.6f} + FR[{NEXT_NET_FUNDING_RATE:.6f}] = * {Expected_Alpha_Net_FR:.6f} *
+ FEES : TAKER: {0.02:.2%}; Expected Alpha w Taker = {Expected_Alpha_Net_FR-0.0002:.6f} [w/o FR: {Expected_Alpha_w_Taker:.6f}]
+
--- ASTER OPEN ORDERS ---
{ASTER_OPEN_ORDERS}
@@ -478,6 +513,7 @@ async def run_algo():
--- EXTEND OPEN ORDERS ---
{EXTEND_OPEN_ORDERS}
''')
+ # Try Making Hedge Order Contingent on Alpha Order Fills (Basically Hedge has to wait for sig Diff in Balance to order.) would improve when extended is thin (Overnight).
if ALGO_CONFIG.Log_Summary_Each_Loop:
print_summary(use_logging=True)
if ALGO_CONFIG.Print_Summary_Each_Loop:
@@ -485,150 +521,160 @@ async def run_algo():
# print_summary()
### ROUTES ###
- # ASTER
- if ASTER_TGT_TAIL_ORDERABLE and ALGO_CONFIG.Allow_Ordering_Aster:
- symbol = ASTER.symbol
- side = 'BUY' if ASTER_TGT_TAIL_BASE_QTY > 0.00 else 'SELL'
- qty = str(abs(ASTER_TGT_TAIL_BASE_QTY))
- price = ASTER_TOB_PX - ALGO_CONFIG.Price_Worsener_Aster if side == 'BUY' else ASTER_TOB_PX + ALGO_CONFIG.Price_Worsener_Aster
-
- if abs( ( float(ASTER_TGT_TAIL_BASE_QTY)*float(price) ) + ASTER_NOTIONAL_POSITION ) > ALGO_CONFIG.Max_Target_Notional*1.01:
- logging.info(f'TRYING TO ORDER OVER MAX NOTIOANL - ASTER: {ASTER_NOTIONAL_POSITION} + {float(ASTER_TGT_TAIL_BASE_QTY)*float(price)} (qty: {float(ASTER_TGT_TAIL_BASE_QTY):.2f}; px: {float(price):.2f})')
- await kill_algo()
- if ASTER_OPEN_ORDERS:
- open_order_id = ASTER_OPEN_ORDERS[0].get('order_id') if ASTER_OPEN_ORDERS[0].get('order_id') is not None else ASTER_OPEN_ORDERS[0]['orderId']
- open_order_px = float(ASTER_OPEN_ORDERS[0].get('price')) if ASTER_OPEN_ORDERS[0].get('price') is not None else float(ASTER_OPEN_ORDERS[0]['original_price'])
- if round(open_order_px - float(price), 2) == 0.00:
- logging.info('ASTER OPEN ORDER NO PX CHG; SKIPPING')
- place_order = False
+ # ALPHA RATIO CHECK
+ if not( ( Expected_Alpha_w_Taker > 0 ) or ( ASTER_OPEN_ORDERS or EXTEND_OPEN_ORDERS ) ):
+ # logging.info(f'Alpha Ratio too low ({ALPHA_RATIO:.8f}) and no Open Orders...')
+ pass
+ else:
+ # logging.info(f'*** Alpha Ratio HIT - LETS ORDER: {ALPHA_RATIO:.8f}')
+ # ASTER
+ if ASTER_TGT_TAIL_ORDERABLE and ALGO_CONFIG.Allow_Ordering_Aster:
+ symbol = ASTER.symbol
+ side = 'BUY' if ASTER_TGT_TAIL_BASE_QTY > 0.00 else 'SELL'
+ qty = str(abs(ASTER_TGT_TAIL_BASE_QTY))
+ price = ASTER_TOB_PX - ALGO_CONFIG.Price_Worsener_Aster if side == 'BUY' else ASTER_TOB_PX + ALGO_CONFIG.Price_Worsener_Aster
+
+ if abs( ( float(ASTER_TGT_TAIL_BASE_QTY)*float(price) ) + ASTER_NOTIONAL_POSITION ) > ALGO_CONFIG.Max_Target_Notional*1.01:
+ logging.info(f'TRYING TO ORDER OVER MAX NOTIOANL - ASTER: {ASTER_NOTIONAL_POSITION} + {float(ASTER_TGT_TAIL_BASE_QTY)*float(price)} (qty: {float(ASTER_TGT_TAIL_BASE_QTY):.2f}; px: {float(price):.2f})')
+ await kill_algo()
+ if ASTER_OPEN_ORDERS:
+ open_order_id = ASTER_OPEN_ORDERS[0].get('order_id') if ASTER_OPEN_ORDERS[0].get('order_id') is not None else ASTER_OPEN_ORDERS[0]['orderId']
+ open_order_px = float(ASTER_OPEN_ORDERS[0].get('price')) if ASTER_OPEN_ORDERS[0].get('price') is not None else float(ASTER_OPEN_ORDERS[0]['original_price'])
+ if round(open_order_px - float(price), 2) == 0.00:
+ logging.info('ASTER OPEN ORDER NO PX CHG; SKIPPING')
+ place_order = False
+ else:
+ cancel_order = {
+ "url": "/fapi/v3/order",
+ "method": "DELETE",
+ "params": {
+ 'symbol': ASTER.symbol,
+ 'orderId': open_order_id,
+ }
+ }
+ cr = await aster_auth.post_authenticated_url(cancel_order)
+ if cr.get('status', None) == 'CANCELED':
+ ASTER_OPEN_ORDERS.pop(0)
+ place_order = True
+ else:
+ logging.warning(f'ASTER ORDER FAILED TO CANCEL DURING CR ({open_order_id}): RESP {cr}')
+ place_order = False
else:
- cancel_order = {
+ place_order = True
+
+ if ASTER_TGT_TAIL_BASE_QTY == 0.00:
+ place_order = False
+ logging.info('ASTER TRYNG TO ORDER 0.00 BASE QTY, SKIPPING')
+
+ if place_order:
+ price = Decimal(str(price)).quantize(Decimal(str(0.01)), rounding=ROUND_DOWN)
+ post_order = {
"url": "/fapi/v3/order",
- "method": "DELETE",
+ "method": "POST",
"params": {
- 'symbol': ASTER.symbol,
- 'orderId': open_order_id,
+ 'symbol': symbol,
+ 'side': side,
+ 'type': 'LIMIT',
+ 'timeInForce': 'GTC',
+ 'quantity': qty,
+ 'price': price,
}
}
- cr = await aster_auth.post_authenticated_url(cancel_order)
- if cr.get('status', None) == 'CANCELED':
- ASTER_OPEN_ORDERS.pop(0)
+ order_resp = await aster_auth.post_authenticated_url(post_order)
+ if order_resp.get('orderId', None) is not None:
+ order_resp['original_price'] = price
+ order_resp['order_status'] = order_resp['status']
+ ASTER_OPEN_ORDERS.append(order_resp)
+ utils.send_tg_alert(f'FR_ALGO - ASTER Order ({order_resp['orderId']}). Start_$: {ASTER_NOTIONAL_POSITION:.2f}; Value: {float(ASTER_TGT_TAIL_BASE_QTY)*float(price):.2f}; Price: {float(price):.2f}')
+ logging.info(f'ASTER ORDER PLACED SUCCESS: {order_resp}')
+ print_summary(use_logging=True)
+ else:
+ pass
+ # logging.warning('ASTER PLACE ORDER CHECKS FAILED, SKIPPING')
+
+ elif not(ASTER_TGT_TAIL_ORDERABLE) and ASTER_OPEN_ORDERS:
+ logging.info('ASTER HAS NO TAIL BUT OPEN ORDERS - CANCELLING OPEN ORDERS')
+ await aster_cancel_all_orders()
+
+ # EXTEND
+ if EXTEND_TGT_TAIL_ORDERABLE and ALGO_CONFIG.Allow_Ordering_Extend:
+ symbol = EXTEND_TICKER
+ side = OrderSide.BUY if EXTEND_TGT_TAIL_BASE_QTY > 0.00 else OrderSide.SELL
+ qty = Decimal(str(abs(EXTEND_TGT_TAIL_BASE_QTY)))
+ price = EXTEND_TOB_PX - ALGO_CONFIG.Price_Worsener_Extend if side == 'BUY' else EXTEND_TOB_PX + ALGO_CONFIG.Price_Worsener_Extend
+
+ if abs( ( float(EXTEND_TGT_TAIL_BASE_QTY)*float(price) ) + EXTEND_NOTIONAL_POSITION ) > ALGO_CONFIG.Max_Target_Notional*1.01:
+ logging.info(f'TRYING TO ORDER OVER MAX NOTIOANL - EXTEND: {EXTEND_NOTIONAL_POSITION:.2f} + {float(EXTEND_TGT_TAIL_BASE_QTY)*float(price):.2f} (qty: {float(EXTEND_TGT_TAIL_BASE_QTY):.2f}; px: {float(price):.2f})')
+ await kill_algo()
+ if EXTEND_OPEN_ORDERS:
+ open_order_dict = dict(EXTEND_OPEN_ORDERS[0])
+ open_order_id = open_order_dict['external_id']
+ open_order_px = float(open_order_dict['price'])
+ open_order_filled_qty = float(open_order_dict['filled_qty'])
+
+ # qty = abs(float(qty)) - abs(float(open_order_filled_qty)) # Was trying to account for partial fills but thats not necessary, handled by position change so qty is correct w/o further adj.
+ # qty = Decimal(str(qty))
+
+ if qty >= MAX_MIN_ORDER_QTY:
place_order = True
else:
- logging.warning(f'ASTER ORDER FAILED TO CANCEL DURING CR ({open_order_id}): RESP {cr}')
place_order = False
- else:
- place_order = True
-
- if ASTER_TGT_TAIL_BASE_QTY == 0.00:
- place_order = False
- logging.info('ASTER TRYNG TO ORDER 0.00 BASE QTY, SKIPPING')
-
- if place_order:
- price = Decimal(str(price)).quantize(Decimal(str(0.01)), rounding=ROUND_DOWN)
- post_order = {
- "url": "/fapi/v3/order",
- "method": "POST",
- "params": {
- 'symbol': symbol,
- 'side': side,
- 'type': 'LIMIT',
- 'timeInForce': 'GTC',
- 'quantity': qty,
- 'price': price,
- }
- }
- order_resp = await aster_auth.post_authenticated_url(post_order)
- if order_resp.get('orderId', None) is not None:
- order_resp['original_price'] = price
- order_resp['order_status'] = order_resp['status']
- ASTER_OPEN_ORDERS.append(order_resp)
- utils.send_tg_alert(f'FR_ALGO - ASTER Order. Start_$: {ASTER_NOTIONAL_POSITION:.2f}; Value: {float(ASTER_TGT_TAIL_BASE_QTY)*float(price):.2f}; Price: {float(price):.2f}')
- logging.info(f'ASTER ORDER PLACED SUCCESS: {order_resp}')
- print_summary(use_logging=True)
- else:
- pass
- # logging.warning('ASTER PLACE ORDER CHECKS FAILED, SKIPPING')
-
- elif not(ASTER_TGT_TAIL_ORDERABLE) and ASTER_OPEN_ORDERS:
- logging.info('ASTER HAS NO TAIL BUT OPEN ORDERS - CANCELLING OPEN ORDERS')
- await aster_cancel_all_orders()
-
- # EXTEND
- if EXTEND_TGT_TAIL_ORDERABLE and ALGO_CONFIG.Allow_Ordering_Extend:
- symbol = EXTEND_TICKER
- side = OrderSide.BUY if EXTEND_TGT_TAIL_BASE_QTY > 0.00 else OrderSide.SELL
- qty = Decimal(str(abs(EXTEND_TGT_TAIL_BASE_QTY)))
- price = EXTEND_TOB_PX - ALGO_CONFIG.Price_Worsener_Extend if side == 'BUY' else EXTEND_TOB_PX + ALGO_CONFIG.Price_Worsener_Extend
-
- if abs( ( float(EXTEND_TGT_TAIL_BASE_QTY)*float(price) ) + EXTEND_NOTIONAL_POSITION ) > ALGO_CONFIG.Max_Target_Notional*1.01:
- logging.info(f'TRYING TO ORDER OVER MAX NOTIOANL - EXTEND: {EXTEND_NOTIONAL_POSITION:.2f} + {float(EXTEND_TGT_TAIL_BASE_QTY)*float(price):.2f} (qty: {float(EXTEND_TGT_TAIL_BASE_QTY):.2f}; px: {float(price):.2f})')
- await kill_algo()
- if EXTEND_OPEN_ORDERS:
- open_order_dict = dict(EXTEND_OPEN_ORDERS[0])
- open_order_id = open_order_dict['external_id']
- open_order_px = float(open_order_dict['price'])
- open_order_filled_qty = float(open_order_dict['filled_qty'])
-
- # qty = abs(float(qty)) - abs(float(open_order_filled_qty)) # Was trying to account for partial fills but thats not necessary, handled by position change so qty is correct w/o further adj.
- # qty = Decimal(str(qty))
-
- if qty >= MAX_MIN_ORDER_QTY:
+ logging.info(f'EXTEND NOT ORDERING DUE TO FILLED QTY RESIDUAL < MIN ORDER; Filled: {float(open_order_filled_qty):.4f}; Residual: {qty:.4f}')
+ else:
+ open_order_id = None
+ open_order_px = 0
place_order = True
- else:
- place_order = False
- logging.info(f'EXTEND NOT ORDERING DUE TO FILLED QTY RESIDUAL < MIN ORDER; Filled: {float(open_order_filled_qty):.4f}; Residual: {qty:.4f}')
- else:
- open_order_id = None
- open_order_px = 0
- place_order = True
- if place_order:
- price = Decimal(str(price)).quantize(Decimal(str(0.01)), rounding=ROUND_DOWN)
- if round(open_order_px - float(price), 2) == 0.00:
- logging.info('EXTEND OPEN ORDER NO PX CHG; SKIPPING')
- else:
- try:
- order_resp = await EXTEND_CLIENT.place_order(
- market_name=symbol,
- amount_of_synthetic=qty,
- price=price,
- side=side,
- taker_fee=Decimal("0.00025"),
- previous_order_id=open_order_id,
- )
- except Exception as e:
- logging.error(f'EXTEND ORDER PLACEMENT FAILED - RESP: {order_resp}')
- logging.error(f'EXTEND ORDER PLACEMENT FAILED: {e}')
- logging.error(traceback.format_exc())
-
- order_resp_dict = dict(order_resp)
-
- if order_resp_dict.get('status', None) == 'OK':
- if EXTEND_OPEN_ORDERS:
- EXTEND_OPEN_ORDERS.pop(0)
-
- order_dict = dict(order_resp_dict['data'])
- order_dict['status'] = 'NEW'
- order_dict['price'] = str(price)
- order_dict['qty'] = str(qty)
- order_dict['filled_qty'] = str(0)
-
- EXTEND_OPEN_ORDERS.append(order_dict)
- utils.send_tg_alert(f'FR_ALGO - EXTEND Order. Start_$: {EXTEND_NOTIONAL_POSITION:.2f}; Value: {float(EXTEND_TGT_TAIL_BASE_QTY)*float(price):.2f}; Price: {float(price):.2f}')
- logging.info(f'EXTEND ORDER PLACED SUCCESS: {order_dict}')
- print_summary(use_logging=True)
+ if place_order:
+ price = Decimal(str(price)).quantize(Decimal(str(0.01)), rounding=ROUND_DOWN)
+ if round(open_order_px - float(price), 2) == 0.00:
+ logging.info('EXTEND OPEN ORDER NO PX CHG; SKIPPING')
else:
- order_resp_dict.get
- else:
- logging.warning('EXTEND PLACE ORDER CHECKS FAILED, SKIPPING')
+ try:
+ order_resp = await EXTEND_CLIENT.place_order(
+ market_name=symbol,
+ amount_of_synthetic=qty,
+ price=price,
+ side=side,
+ taker_fee=Decimal("0.00025"),
+ previous_order_id=open_order_id,
+ )
+ except Exception as e:
+ logging.error(f'EXTEND ORDER PLACEMENT FAILED - RESP: {order_resp}')
+ logging.error(f'EXTEND ORDER PLACEMENT FAILED: {e}')
+ logging.error(traceback.format_exc())
- elif not(EXTEND_TGT_TAIL_ORDERABLE) and EXTEND_OPEN_ORDERS:
- logging.info('EXTEND HAS NO TAIL BUT OPEN ORDERS - CANCELLING OPEN ORDERS')
- await extend_cancel_all_orders()
+ order_resp_dict = dict(order_resp)
+
+ if order_resp_dict.get('status', None) == 'OK':
+ if EXTEND_OPEN_ORDERS:
+ EXTEND_OPEN_ORDERS.pop(0)
+
+ order_dict = dict(order_resp_dict['data'])
+ order_dict['status'] = 'NEW'
+ order_dict['price'] = str(price)
+ order_dict['qty'] = str(qty)
+ order_dict['filled_qty'] = str(0)
+ order_dict['side'] = str(side)
+
+ EXTEND_OPEN_ORDERS.append(order_dict)
+ utils.send_tg_alert(f'FR_ALGO - EXTEND Order ({order_dict.get('id', None)}). Start_$: {EXTEND_NOTIONAL_POSITION:.2f}; Value: {float(EXTEND_TGT_TAIL_BASE_QTY)*float(price):.2f}; Price: {float(price):.2f}')
+ logging.info(f'EXTEND ORDER PLACED SUCCESS: {order_dict}')
+ print_summary(use_logging=True)
+ else:
+ order_resp_dict.get
+ else:
+ logging.warning('EXTEND PLACE ORDER CHECKS FAILED, SKIPPING')
- # print(f'__________ End ___________ (Algo Engine ms: {(time.time() - loop_start)*1000}); Sleeping for sec: {ALGO_CONFIG.Loop_Sleep_Sec}')
-
- time.sleep(ALGO_CONFIG.Loop_Sleep_Sec)
+ elif not(EXTEND_TGT_TAIL_ORDERABLE) and EXTEND_OPEN_ORDERS:
+ logging.info('EXTEND HAS NO TAIL BUT OPEN ORDERS - CANCELLING OPEN ORDERS')
+ await extend_cancel_all_orders()
+
+
+ if ASTER_OPEN_ORDERS or EXTEND_OPEN_ORDERS:
+ continue
+ else:
+ time.sleep(ALGO_CONFIG.Loop_Sleep_Sec)
+ # logging.info(f'_____ End No Open Orders _____ (Algo Engine ms: {(time.time() - loop_start)*1000:.2f}); Sleeping for sec: {ALGO_CONFIG.Loop_Sleep_Sec:.0f}')
except KeyboardInterrupt:
logging.info('CANCELLING OPEN ORDERS')
diff --git a/modules/structs.py b/modules/structs.py
index 2e3092e..d2bf0b3 100644
--- a/modules/structs.py
+++ b/modules/structs.py
@@ -13,12 +13,14 @@ class Algo_Config:
Loop_Sleep_Sec: int
Max_Target_Notional: float
Min_Time_To_Funding_Minutes: int
+ Min_Fund_Rate_Pct_To_Trade: float
Price_Worsener_Aster: float
Price_Worsener_Extend: float
Target_Open_Cash_Position: int
Log_Summary_Each_Loop: bool = False
Print_Summary_Each_Loop: bool = False
+ Flatten_Open_Positions: bool = False
Flip_Side_For_Testing: bool = False
@dataclass(kw_only=True)