01_MichaelHarris_WinningPatterns.ipynb - Colab
01_MichaelHarris_WinningPatterns.ipynb - Colab
import pandas as pd
import pandas_ta as ta
from tqdm import tqdm
import os
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots
tqdm.pandas()
def read_csv_to_dataframe(file_path):
df = pd.read_csv(file_path)
df["Gmt time"] = df["Gmt time"].str.replace(".000", "")
df['Gmt time'] = pd.to_datetime(df['Gmt time'], format='%d.%m.%Y %H:%M:%S')
df = df[df.High != df.Low]
df.set_index("Gmt time", inplace=True)
return df
def read_data_folder(folder_path="./data"):
dataframes = []
file_names = []
for file_name in tqdm(os.listdir(folder_path)):
if file_name.endswith('.csv'):
file_path = os.path.join(folder_path, file_name)
df = read_csv_to_dataframe(file_path)
dataframes.append(df)
file_names.append(file_name)
return dataframes, file_names
return 0
def add_total_signal(df):
df['TotalSignal'] = df.progress_apply(lambda row: total_signal(df, row.name), a
return df
Parameters:
df (DataFrame): DataFrame containing the stock data with the specified SR colum
sr_column (str): The name of the column to consider for the SR (support/resista
Returns:
DataFrame: The original DataFrame with an additional 'pointpos' column.
"""
def pointpos(row):
if row[signal_column] == 2:
return row['Low'] - 1e-4
elif row[signal_column] == 1:
return row['High'] + 1e-4
else:
return np.nan
Parameters:
df (DataFrame): DataFrame containing the stock data with 'Open', 'High', 'Low',
start_index (int): The starting index for the subset of data to plot.
num_rows (int): The number of rows of data to plot.
Returns:
None
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 2 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
None
"""
df_subset = df[start_index:start_index + num_rows]
fig.add_trace(go.Candlestick(x=df_subset.index,
open=df_subset['Open'],
high=df_subset['High'],
low=df_subset['Low'],
close=df_subset['Close'],
name='Candlesticks'),
row=1, col=1)
fig.update_layout(
width=1200,
height=800,
plot_bgcolor='black',
paper_bgcolor='black',
font=dict(color='white'),
xaxis=dict(showgrid=False, zeroline=False),
yaxis=dict(showgrid=False, zeroline=False),
showlegend=True,
legend=dict(
x=0.01,
y=0.99,
traceorder="normal",
font=dict(
family="sans-serif",
size=12,
color="white"
),
bgcolor="black",
bordercolor="gray",
borderwidth=2
)
)
fig.show()
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 3 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
folder_path = "./data_forex"
dataframes, file_names = read_data_folder(folder_path)
for i, df in enumerate(dataframes):
print("working on dataframe ", i, "...")
df = add_total_signal(df)
df = add_pointpos_column(df, "TotalSignal")
dataframes[i] = df # Update the dataframe in the list
TotalSignal
0 15208.0
1 NaN
2 154.0
Name: count, dtype: float64
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 4 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
def SIGNAL():
return df.TotalSignal
class MyStrat(Strategy):
mysize = 0.1 # Trade size
slperc = 0.04
tpperc = 0.02
def init(self):
super().init()
self.signal1 = self.I(SIGNAL) # Assuming SIGNAL is a function that returns
def next(self):
super().next()
f:\Python\Lib\site-packages\tqdm\auto.py:21: TqdmWarning:
IProgress not found. Please update jupyter and ipywidgets. See https://ipywidge
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 5 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
results = []
heatmaps = []
for df in dataframes:
bt = Backtest(df, MyStrat, cash=5000, margin=1/5, commission=0.0002)
stats, heatmap = bt.optimize(slperc=[i/100 for i in range(1, 8)],
tpperc=[i/100 for i in range(1, 8)],
maximize='Return [%]', max_tries=3000,
random_state=0,
return_heatmap=True)
results.append(stats)
heatmaps.append(heatmap)
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 6 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
# Pad each equity curve with the last value to match the maximum length
padded_equity_curves = []
for equity in equity_curves:
last_value = equity.iloc[-1]
padding = [last_value] * (max_length - len(equity))
padded_equity = equity.tolist() + padding
padded_equity_curves.append(padded_equity)
equity_df = pd.DataFrame(padded_equity_curves).T
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 7 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
<matplotlib.legend.Legend at 0x289b7409290>
5800
AUDUSD_Candlestick_1_D_BID_06.06.2017-15.06.2024.csv
EURUSD_Candlestick_1_D_BID_06.06.2017-15.06.2024.CSV
GBPUSD_Candlestick_1_D_BID_06.06.2017-15.06.2024.csv
5600- NZDUSD_Candlestick_1_D_BID_06.06.2017-15.06.2024.CSV
USDCHF_Candlestick_1D_BID_06.06.2017-15.06.2024.CSV
USDJPY_Candlestick_1_D_BID_06.06.2017-15.06.2024.cSV
XAUUSD_Candlestick_1_D_BID_06.06.2017-15.06.2024.csv
5400-
5200-
5000
4800-
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 8 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
[3.0818825046799976,
-2.5188213194800118,
13.53912743511999,
-1.5689230771600342,
3.6504297886800483,
10.508764060000031,
0.6493776159999834]
names
['QQQ.USUSD_Candlestick_1_D_BID_26.01.2017-06.07.2024.csv',
'SPY.USUSD_Candlestick_1_D_BID_16.02.2017-06.07.2024.csv',
'VXX.USUSD_Candlestick_1_D_BID_16.02.2017-06.07.2024.csv']
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 9 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
-0 7 10 15 20 19
2 7 12 12 17 20 21
3 13 19 22 22 24 31
s/perc
4
3 11 16 18 19 21 27
2 11 14 15 17 19 25
6 17 20 26 31 30 33
8 23 28 38 42 39 48
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 10 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
results[1]
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 11 of 12
01_MichaelHarris_WinningPatterns.ipynb - Colab 24/11/24, 13:22
https://colab.research.google.com/drive/1kU07kZymWt1_E0eI3J8GGO5FCCTsk-YO#scrollTo=EfJaT46L0bCu Page 12 of 12