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": "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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_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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
price_median_asterprice_median_extendratio
timestamp_trade_dt
2026-04-27 15:24:002267.7002269.500.999207
2026-04-27 15:25:002267.3002267.251.000022
2026-04-27 15:26:002268.3002267.601.000309
2026-04-27 15:27:002271.6102271.601.000004
2026-04-27 15:28:002271.2252270.701.000231
............
2026-04-28 03:54:002287.5002287.101.000175
2026-04-28 03:57:002289.3102288.601.000310
2026-04-28 04:01:002288.1152288.200.999963
2026-04-28 04:02:002287.3702287.400.999987
2026-04-28 04:06:002287.7102287.101.000267
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
marketfunding_ratetimestamptimestamp_dt
0ETH-USD-0.00002317773488010282026-04-28 04:00:01.028
1ETH-USD-0.00000217773452010182026-04-28 03:00:01.018
2ETH-USD0.00000317773416010192026-04-28 02:00:01.019
3ETH-USD-0.00000117773380010322026-04-28 01:00:01.032
4ETH-USD0.00001117773344010262026-04-28 00:00:01.026
5ETH-USD017773308010112026-04-27 23:00:01.011
6ETH-USD0.00001317773272003422026-04-27 22:00:00.342
7ETH-USD-0.00000317773236003422026-04-27 21:00:00.342
8ETH-USD017773200007222026-04-27 20:00:00.722
9ETH-USD0.00000317773164009342026-04-27 19:00:00.934
10ETH-USD-0.00001517773128010252026-04-27 18:00:01.025
11ETH-USD-0.00000717773092010122026-04-27 17:00:01.012
12ETH-USD0.00001317773056003432026-04-27 16:00:00.343
\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)