631 lines
173 KiB
Plaintext
631 lines
173 KiB
Plaintext
{
|
|||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "6d202eb3",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# Import Libaries"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 1,
|
||
|
|
"id": "5d0e0f92",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"import pandas as pd\n",
|
||
|
|
"import pandas_ta as ta\n",
|
||
|
|
"import MetaTrader5 as mt\n",
|
||
|
|
"import keyring as kr"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "de2abb26",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# Login"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 2,
|
||
|
|
"id": "51d9b448",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"text/plain": [
|
||
|
|
"True"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"execution_count": 2,
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "execute_result"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# login to your Trading Account - sign up in the description\n",
|
||
|
|
"mt.initialize()\n",
|
||
|
|
" \n",
|
||
|
|
"login = 10800246\n",
|
||
|
|
"server = 'VantageInternational-Demo'\n",
|
||
|
|
"password = kr.get_password(server, str(login))\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"mt.login(login, password, server)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 3,
|
||
|
|
"id": "c92d8dee",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"text/plain": [
|
||
|
|
"'trading-demo'"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"execution_count": 3,
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "execute_result"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"project = \"trading-\" + server[-4::1]\n",
|
||
|
|
"project = project.lower()\n",
|
||
|
|
"project"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 4,
|
||
|
|
"id": "16e26255",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"symbols = ['XAUUSD']"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 5,
|
||
|
|
"id": "20de0d64",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"periods_dict = {\n",
|
||
|
|
" 'BTCUSD' : ['h1', 'm30', 'm15', 'm5', 'm1'],\n",
|
||
|
|
" \n",
|
||
|
|
" 'ETHUSD' : ['h1', 'm30', 'm15', 'm5', 'm1'],\n",
|
||
|
|
"\n",
|
||
|
|
" \n",
|
||
|
|
" 'XRPUSD': ['h1', 'm30', 'm15', 'm5', 'm1'],\n",
|
||
|
|
" \n",
|
||
|
|
" 'XAUUSD': [ 'm5'],\n",
|
||
|
|
"\n",
|
||
|
|
" \n",
|
||
|
|
" 'EURUSD': ['h1', 'm30', 'm15', 'm5', 'm1'],\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
" 'EURNZD': ['m5', 'm2', 'm1'],\n",
|
||
|
|
"\n",
|
||
|
|
"}"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 6,
|
||
|
|
"id": "e65dfd75",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"symbol = 'XAUUSD'"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "874862b3",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": []
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 107,
|
||
|
|
"id": "95f9b002",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def get_rates():\n",
|
||
|
|
"\n",
|
||
|
|
" ohlc = mt.copy_rates_from_pos(symbol, mt.TIMEFRAME_M5, 0, 200)\n",
|
||
|
|
" df = pd.DataFrame(ohlc)\n",
|
||
|
|
" df['time']=pd.to_datetime(df['time'], unit='s')\n",
|
||
|
|
"\n",
|
||
|
|
" #df = df[[\"time\",\"open\",\"high\",\"low\",\"close\"]]\n",
|
||
|
|
"\n",
|
||
|
|
" df[\"open\"] = df.open.astype(float)\n",
|
||
|
|
" df[\"high\"] = df.high.astype(float)\n",
|
||
|
|
" df[\"low\"] = df.low.astype(float)\n",
|
||
|
|
" df[\"close\"] = df.close.astype(float)\n",
|
||
|
|
"\n",
|
||
|
|
" ## Take the rolling atr so the yaxis doesn't shake too much \n",
|
||
|
|
" df[\"atr\"] = ta.atr(high=df.high, low=df.low, close=df.close)\n",
|
||
|
|
" df[\"atr\"] = df.atr.rolling(window=30).mean()\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
" df.set_index(\"time\", inplace = True)\n",
|
||
|
|
"\n",
|
||
|
|
" return df"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "42dd19c7",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# Plotting Price Data"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 10,
|
||
|
|
"id": "17a837df",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"%matplotlib inline\n",
|
||
|
|
"\n",
|
||
|
|
"import matplotlib.pyplot as plt\n",
|
||
|
|
"from matplotlib.animation import FuncAnimation\n",
|
||
|
|
"from scipy.signal import savgol_filter\n",
|
||
|
|
"from scipy.signal import find_peaks\n",
|
||
|
|
"from IPython import display\n",
|
||
|
|
"from IPython.display import HTML\n",
|
||
|
|
"pd.set_option('mode.chained_assignment', None)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 20,
|
||
|
|
"id": "be326702",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"#df2 = df.iloc[0:500]\n",
|
||
|
|
"df2 = df\n",
|
||
|
|
"\n",
|
||
|
|
"fig, ax = plt.subplots()\n",
|
||
|
|
"plt.xticks(rotation=-30)\n",
|
||
|
|
"price, = ax.plot(df2.index, df2.close, c='grey', lw=2, alpha=0.5, zorder=5)\n",
|
||
|
|
"\n",
|
||
|
|
"plt.show()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 15,
|
||
|
|
"id": "e27cba63",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"#df2 = df.iloc[0:500]\n",
|
||
|
|
"df2 = df\n",
|
||
|
|
"\n",
|
||
|
|
"df2[\"close_smooth\"] = savgol_filter(df2.close, 49, 5)\n",
|
||
|
|
"\n",
|
||
|
|
"fig, ax = plt.subplots()\n",
|
||
|
|
"plt.xticks(rotation=-30)\n",
|
||
|
|
"price, = ax.plot(df2.index, df2.close, c='grey', lw=2, alpha=0.5, zorder=5)\n",
|
||
|
|
"price_smooth, = ax.plot(df2.index, df2.close_smooth, c='b', lw=2, zorder=5)\n",
|
||
|
|
"\n",
|
||
|
|
"plt.show()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "b00d9b70",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# Detecting Extrema"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 112,
|
||
|
|
"id": "2c1a99ec",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"downtrend\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"#df2 = df.iloc[0:500]\n",
|
||
|
|
"df2 = get_rates()\n",
|
||
|
|
"\n",
|
||
|
|
"df2[\"close_smooth\"] = savgol_filter(df2.close, 49, 5)\n",
|
||
|
|
"\n",
|
||
|
|
"fig, ax = plt.subplots()\n",
|
||
|
|
"plt.xticks(rotation=-30)\n",
|
||
|
|
"price, = ax.plot(df2.index, df2.close, c='grey', lw=2, alpha=0.5, zorder=5)\n",
|
||
|
|
"price_smooth, = ax.plot(df2.index, df2.close_smooth, c='b', lw=2, zorder=5)\n",
|
||
|
|
"\n",
|
||
|
|
"atr = df2.atr.iloc[-1] # all the first atrs are NaN\n",
|
||
|
|
"\n",
|
||
|
|
"peaks_idx, _ = find_peaks(df2.close_smooth, distance = 15, \n",
|
||
|
|
" width = 3, prominence=atr)\n",
|
||
|
|
"\n",
|
||
|
|
"troughs_idx, _ = find_peaks(-1*df2.close_smooth, distance = 15, \n",
|
||
|
|
" width = 3, prominence=atr)\n",
|
||
|
|
"\n",
|
||
|
|
"peaks, = ax.plot(df2.index[peaks_idx], df2.close_smooth.iloc[peaks_idx], \\\n",
|
||
|
|
" c=\"r\", linestyle='None', markersize = 10.0, marker = \"o\", zorder=10)\n",
|
||
|
|
"\n",
|
||
|
|
"troughs, = ax.plot(df2.index[troughs_idx], df2.close_smooth.iloc[troughs_idx], \\\n",
|
||
|
|
" c=\"g\", linestyle='None', markersize = 10.0, marker = \"o\", zorder=10)\n",
|
||
|
|
"\n",
|
||
|
|
"plt.show()\n",
|
||
|
|
"\n",
|
||
|
|
"#print(peaks_idx[-1], troughs_idx[-1])\n",
|
||
|
|
"\n",
|
||
|
|
"if peaks_idx[-1] > troughs_idx[-1]:\n",
|
||
|
|
" print(\"downtrend\")\n",
|
||
|
|
"else:\n",
|
||
|
|
" print(\"uptrend\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "3865822f",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# Finding Runs"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 89,
|
||
|
|
"id": "5a190d91",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"[21] [85] Line2D(_child2) Line2D(_child3)\n",
|
||
|
|
"1 0\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"df2 = df.iloc[0:100]\n",
|
||
|
|
"#df2 = df.tail(50)\n",
|
||
|
|
"\n",
|
||
|
|
"df2[\"close_smooth\"] = savgol_filter(df2.close, 49, 5)\n",
|
||
|
|
"\n",
|
||
|
|
"fig, ax = plt.subplots()\n",
|
||
|
|
"plt.xticks(rotation=-30)\n",
|
||
|
|
"plt.xticks(rotation=-30)\n",
|
||
|
|
"price, = ax.plot(df2.index, df2.close, c='grey', lw=2, alpha=0.5, zorder=5)\n",
|
||
|
|
"price_smooth, = ax.plot(df2.index, df2.close_smooth, c='b', lw=2, zorder=5)\n",
|
||
|
|
"\n",
|
||
|
|
"atr = df2.atr.iloc[-1] # all the first atrs are NaN\n",
|
||
|
|
"\n",
|
||
|
|
"peaks_idx, _ = find_peaks(df2.close_smooth, distance = 15, \n",
|
||
|
|
" width = 3, prominence=atr)\n",
|
||
|
|
"\n",
|
||
|
|
"troughs_idx, _ = find_peaks(-1*df2.close_smooth, distance = 15, \n",
|
||
|
|
" width = 3, prominence=atr)\n",
|
||
|
|
"\n",
|
||
|
|
"peaks, = ax.plot(df2.index[peaks_idx], df2.close_smooth.iloc[peaks_idx], \\\n",
|
||
|
|
" c=\"r\", linestyle='None', markersize = 10.0, marker = \"o\", zorder=10)\n",
|
||
|
|
"\n",
|
||
|
|
"troughs, = ax.plot(df2.index[troughs_idx], df2.close_smooth.iloc[troughs_idx], \\\n",
|
||
|
|
" c=\"g\", linestyle='None', markersize = 10.0, marker = \"o\", zorder=10)\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"print(peaks_idx, troughs_idx, peaks, troughs)\n",
|
||
|
|
"\n",
|
||
|
|
"up_run_length = 0\n",
|
||
|
|
"up_run = True\n",
|
||
|
|
"down_run_length = 0\n",
|
||
|
|
"while up_run:\n",
|
||
|
|
" if 2 + up_run_length > len(peaks_idx) or 2 + up_run_length > len(troughs_idx):\n",
|
||
|
|
" break\n",
|
||
|
|
" if df2.close_smooth.iloc[peaks_idx[-1 - up_run_length]] > df2.close_smooth.iloc[peaks_idx[-2 - up_run_length]] and \\\n",
|
||
|
|
" df2.close_smooth.iloc[troughs_idx[-1 - up_run_length]] > df2.close_smooth.iloc[troughs_idx[-2 - up_run_length]]:\n",
|
||
|
|
" up_run_length += 1\n",
|
||
|
|
" else:\n",
|
||
|
|
" up_run = False \n",
|
||
|
|
"\n",
|
||
|
|
"# down_run_length = 0\n",
|
||
|
|
"# down_run = True\n",
|
||
|
|
"# while down_run:\n",
|
||
|
|
"# if 2 + down_run_length > len(peaks_idx) or 2 + down_run_length > len(troughs_idx):\n",
|
||
|
|
"# break\n",
|
||
|
|
" \n",
|
||
|
|
"# if df2.close_smooth.iloc[peaks_idx[-1 - down_run_length]] < df2.close_smooth.iloc[peaks_idx[-2 - down_run_length]] and \\\n",
|
||
|
|
"# df2.close_smooth.iloc[troughs_idx[-1 - down_run_length]] < + df2.close_smooth.iloc[troughs_idx[-2 - down_run_length]]:\n",
|
||
|
|
"# down_run_length += 1\n",
|
||
|
|
"# else:\n",
|
||
|
|
"# down_run = False\n",
|
||
|
|
" \n",
|
||
|
|
"\n",
|
||
|
|
"if up_run_length > 0:\n",
|
||
|
|
" ax.set_facecolor((150/255, 255/255, 159/255, 0.3))\n",
|
||
|
|
" pause_trading = 0\n",
|
||
|
|
"else:# down_run_length > 0:\n",
|
||
|
|
" ax.set_facecolor((255/255, 255/255, 80/255, 0.3))\n",
|
||
|
|
" pause_trading = 1\n",
|
||
|
|
" \n",
|
||
|
|
"print(pause_trading, up_run_length)\n",
|
||
|
|
"\n",
|
||
|
|
"plt.show()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 55,
|
||
|
|
"id": "6b7b9586",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"#if df2.close_smooth.iloc[peaks_idx[-1 - down_run_length]] < df2.close_smooth.iloc[peaks_idx[-2 - down_run_length]] :\n",
|
||
|
|
"#\\\n",
|
||
|
|
"if df2.close_smooth.iloc[troughs_idx[-1 - down_run_length]] < df2.close_smooth.iloc[troughs_idx[-1 - down_run_length]]:\n",
|
||
|
|
" print(True)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "564deae7",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"!pip install ffmpeg-python "
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "414f56a7",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": []
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 31,
|
||
|
|
"id": "e8e6c15e",
|
||
|
|
"metadata": {
|
||
|
|
"scrolled": false
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"c:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\animation.py:1740: UserWarning: Can not start iterating the frames for the initial draw. This can be caused by passing in a 0 length sequence for *frames*.\n",
|
||
|
|
"\n",
|
||
|
|
"If you passed *frames* as a generator it may be exhausted due to a previous display or save.\n",
|
||
|
|
" warnings.warn(\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"ename": "RuntimeError",
|
||
|
|
"evalue": "Requested MovieWriter (ffmpeg) not available",
|
||
|
|
"output_type": "error",
|
||
|
|
"traceback": [
|
||
|
|
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||
|
|
"\u001b[1;31mRuntimeError\u001b[0m Traceback (most recent call last)",
|
||
|
|
"Cell \u001b[1;32mIn[31], line 85\u001b[0m\n\u001b[0;32m 81\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m price, price_smooth, peaks, troughs\n\u001b[0;32m 84\u001b[0m anim \u001b[38;5;241m=\u001b[39m FuncAnimation(fig, animate, frames\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mlen\u001b[39m(df)\u001b[38;5;241m-\u001b[39mbars_in_frame, interval\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m40\u001b[39m, blit\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m---> 85\u001b[0m video \u001b[38;5;241m=\u001b[39m HTML(anim\u001b[38;5;241m.\u001b[39mto_html5_video())\n\u001b[0;32m 86\u001b[0m display\u001b[38;5;241m.\u001b[39mdisplay(video)\n",
|
||
|
|
"File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\animation.py:1284\u001b[0m, in \u001b[0;36mAnimation.to_html5_video\u001b[1;34m(self, embed_limit)\u001b[0m\n\u001b[0;32m 1281\u001b[0m path \u001b[38;5;241m=\u001b[39m Path(tmpdir, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtemp.m4v\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 1282\u001b[0m \u001b[38;5;66;03m# We create a writer manually so that we can get the\u001b[39;00m\n\u001b[0;32m 1283\u001b[0m \u001b[38;5;66;03m# appropriate size for the tag\u001b[39;00m\n\u001b[1;32m-> 1284\u001b[0m Writer \u001b[38;5;241m=\u001b[39m writers[mpl\u001b[38;5;241m.\u001b[39mrcParams[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124manimation.writer\u001b[39m\u001b[38;5;124m'\u001b[39m]]\n\u001b[0;32m 1285\u001b[0m writer \u001b[38;5;241m=\u001b[39m Writer(codec\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mh264\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 1286\u001b[0m bitrate\u001b[38;5;241m=\u001b[39mmpl\u001b[38;5;241m.\u001b[39mrcParams[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124manimation.bitrate\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[0;32m 1287\u001b[0m fps\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1000.\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_interval)\n\u001b[0;32m 1288\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msave(\u001b[38;5;28mstr\u001b[39m(path), writer\u001b[38;5;241m=\u001b[39mwriter)\n",
|
||
|
|
"File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\animation.py:148\u001b[0m, in \u001b[0;36mMovieWriterRegistry.__getitem__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 146\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mis_available(name):\n\u001b[0;32m 147\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_registered[name]\n\u001b[1;32m--> 148\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRequested MovieWriter (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) not available\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
|
||
|
|
"\u001b[1;31mRuntimeError\u001b[0m: Requested MovieWriter (ffmpeg) not available"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"import matplotlib\n",
|
||
|
|
"matplotlib.rcParams['animation.embed_limit'] = 2**128\n",
|
||
|
|
"\n",
|
||
|
|
"bars_in_frame = 300\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"fig, ax = plt.subplots()\n",
|
||
|
|
"\n",
|
||
|
|
"# increase video quality\n",
|
||
|
|
"#fig, ax = plt.subplots(figsize=(8,8), dpi=300)\n",
|
||
|
|
"\n",
|
||
|
|
"price, = ax.plot([], c='grey', lw=3, alpha=0.5, zorder=5)\n",
|
||
|
|
"price_smooth, = ax.plot([], c='b', lw=5, zorder=5)\n",
|
||
|
|
"peaks, = ax.plot([], c=\"r\", linestyle='None', markersize = 15.0, marker = \"o\", zorder=10)\n",
|
||
|
|
"troughs, = ax.plot([], c=\"g\", linestyle='None', markersize = 15.0, marker = \"o\", zorder=10)\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"## Might turn the yaxis off, can be annoying\n",
|
||
|
|
"ax.set_ylim(15000,20000)\n",
|
||
|
|
"ax.set_xlim(0,bars_in_frame)\n",
|
||
|
|
"\n",
|
||
|
|
"def animate(frame):\n",
|
||
|
|
" \n",
|
||
|
|
" frames_behind = 30\n",
|
||
|
|
"\n",
|
||
|
|
" df2 = df.iloc[-len(df) + frame + 30:frame+bars_in_frame + 30]\n",
|
||
|
|
" df2[\"close_smooth\"] = savgol_filter(df2.close, 49, 5)\n",
|
||
|
|
"\n",
|
||
|
|
" df2 = df2.iloc[frames_behind:]\n",
|
||
|
|
" \n",
|
||
|
|
" x_coords = [x for x in range(len(df2.close_smooth))]\n",
|
||
|
|
" \n",
|
||
|
|
" price.set_data((x_coords, df2.close))\n",
|
||
|
|
" price_smooth.set_data((x_coords, df2.close_smooth))\n",
|
||
|
|
" \n",
|
||
|
|
" first_atr = df2.atr.iloc[0]\n",
|
||
|
|
" \n",
|
||
|
|
" ax.set_ylim(df2.close_smooth.min() - 10*first_atr, df2.close_smooth.max() + 10*first_atr)\n",
|
||
|
|
" \n",
|
||
|
|
" peaks_idx, _ = find_peaks(df2.close_smooth, distance = 15, \n",
|
||
|
|
" width = 3, prominence=first_atr)\n",
|
||
|
|
"\n",
|
||
|
|
" troughs_idx, _ = find_peaks(-1*df2.close_smooth, distance = 15, \n",
|
||
|
|
" width = 3, prominence=first_atr)\n",
|
||
|
|
" \n",
|
||
|
|
" up_run_length = 0\n",
|
||
|
|
" up_run = True\n",
|
||
|
|
" while up_run:\n",
|
||
|
|
" if 2 + up_run_length > len(peaks_idx) or 2 + up_run_length > len(troughs_idx):\n",
|
||
|
|
" break\n",
|
||
|
|
"\n",
|
||
|
|
" if df2.close_smooth.iloc[peaks_idx[-1 - up_run_length]] > df2.close_smooth.iloc[peaks_idx[-2 - up_run_length]] and \\\n",
|
||
|
|
" df2.close_smooth.iloc[troughs_idx[-1 - up_run_length]] > df2.close_smooth.iloc[troughs_idx[-2 - up_run_length]]:\n",
|
||
|
|
" up_run_length += 1\n",
|
||
|
|
" else:\n",
|
||
|
|
" up_run = False\n",
|
||
|
|
"\n",
|
||
|
|
" down_run_length = 0\n",
|
||
|
|
" down_run = True\n",
|
||
|
|
" while down_run:\n",
|
||
|
|
" if 2 + down_run_length > len(peaks_idx) or 2 + down_run_length > len(troughs_idx):\n",
|
||
|
|
" break\n",
|
||
|
|
" \n",
|
||
|
|
" if df2.close_smooth.iloc[peaks_idx[-1 - down_run_length]] < df2.close_smooth.iloc[peaks_idx[-2 - down_run_length]] and \\\n",
|
||
|
|
" df2.close_smooth.iloc[troughs_idx[-1 - down_run_length]] < + df2.close_smooth.iloc[troughs_idx[-2 - down_run_length]]:\n",
|
||
|
|
" down_run_length += 1\n",
|
||
|
|
" else:\n",
|
||
|
|
" down_run = False\n",
|
||
|
|
" \n",
|
||
|
|
" peaks.set_data((peaks_idx, df2.close_smooth.iloc[peaks_idx]))\n",
|
||
|
|
" troughs.set_data((troughs_idx, df2.close_smooth.iloc[troughs_idx]))\n",
|
||
|
|
" \n",
|
||
|
|
" if up_run_length > 0:\n",
|
||
|
|
" \n",
|
||
|
|
" ax.set_facecolor((150/255, 255/255, 159/255, 0.3))\n",
|
||
|
|
" elif down_run_length > 0:\n",
|
||
|
|
" ax.set_facecolor((255/255, 150/255, 150/255, 0.3))\n",
|
||
|
|
" else:\n",
|
||
|
|
" ax.set_facecolor(\"white\")\n",
|
||
|
|
" \n",
|
||
|
|
" return price, price_smooth, peaks, troughs\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"anim = FuncAnimation(fig, animate, frames=len(df)-bars_in_frame, interval=40, blit=True)\n",
|
||
|
|
"video = HTML(anim.to_html5_video())\n",
|
||
|
|
"display.display(video)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"id": "87748618",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"# Saving our animation"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "8d808048",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"with open('video-hd.html', 'w') as f:\n",
|
||
|
|
" f.write(video.data)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "21838944",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": []
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "base",
|
||
|
|
"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.11.5"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 5
|
||
|
|
}
|