Hey, thanks for your great work. I have a few questions.
import pandas as pd
import plotly.graph_objects as go
import sys
import os
from binance.client import Client
from datetime import datetime
import numpy as np
import time
from smartmoneyconcepts.smc import smc
def add_swing_highs_lows(fig, swing_highs_lows_data):
indexs = []
level = []
for i in range(len(swing_highs_lows_data)):
if not np.isnan(swing_highs_lows_data["HighLow"][i]):
indexs.append(i)
level.append(swing_highs_lows_data["Level"][i])
# plot these lines on a graph
for i in range(len(indexs) - 1):
fig.add_trace(
go.Scatter(
x=[df.index[indexs[i]], df.index[indexs[i + 1]]],
y=[level[i], level[i + 1]],
mode="lines",
line=dict(
color=(
"green"
if swing_highs_lows_data["HighLow"][indexs[i]] == -1
else "red"
),
),
)
)
return fig
def add_OB(fig, ob_data):
def format_volume(volume):
if volume >= 1e12:
return f"{volume / 1e12:.3f}T"
elif volume >= 1e9:
return f"{volume / 1e9:.3f}B"
elif volume >= 1e6:
return f"{volume / 1e6:.3f}M"
elif volume >= 1e3:
return f"{volume / 1e3:.3f}k"
else:
return f"{volume:.2f}"
for i in range(len(ob_data["OB"])):
if ob_data["OB"][i] == 1:
x1 = int(
ob_data["MitigatedIndex"][i]
if ob_data["MitigatedIndex"][i] != 0
else len(df) - 1
)
fig.add_shape(
type="rect",
x0=df.index[i],
y0=ob_data["Bottom"][i],
x1=df.index[x1],
y1=ob_data["Top"][i],
line=dict(color="Green"),
fillcolor="Green",
opacity=0.3,
name="Bullish OB",
legendgroup="bullish ob",
showlegend=True,
)
if ob_data["MitigatedIndex"][i] > 0:
x_center = df.index[int(i + (ob_data["MitigatedIndex"][i] - i) / 2)]
else:
x_center = df.index[int(i + (len(df) - i) / 2)]
y_center = (ob_data["Bottom"][i] + ob_data["Top"][i]) / 2
volume_text = format_volume(ob_data["OBVolume"][i])
# Add annotation text
annotation_text = f'{volume_text} ({ob_data["Percentage"][i]}%)'
fig.add_annotation(
x=x_center,
y=y_center,
xref="x",
yref="y",
align="center",
text=annotation_text,
font=dict(color="white", size=8),
showarrow=False,
)
for i in range(len(ob_data["OB"])):
if ob_data["OB"][i] == -1:
x1 = int(
ob_data["MitigatedIndex"][i]
if ob_data["MitigatedIndex"][i] != 0
else len(df) - 1
)
fig.add_shape(
type="rect",
x0=df.index[i],
y0=ob_data["Bottom"][i],
x1=df.index[x1],
y1=ob_data["Top"][i],
line=dict(color="Red"),
fillcolor="Red",
opacity=0.3,
name="Bearish OB",
legendgroup="bearish ob",
showlegend=True,
)
if ob_data["MitigatedIndex"][i] > 0:
x_center = df.index[int(i + (ob_data["MitigatedIndex"][i] - i) / 2)]
else:
x_center = df.index[int(i + (len(df) - i) / 2)]
y_center = (ob_data["Bottom"][i] + ob_data["Top"][i]) / 2
volume_text = format_volume(ob_data["OBVolume"][i])
# Add annotation text
annotation_text = f'{volume_text} ({ob_data["Percentage"][i]}%)'
fig.add_annotation(
x=x_center,
y=y_center,
xref="x",
yref="y",
align="center",
text=annotation_text,
font=dict(color="white", size=8),
showarrow=False,
)
return fig
def import_data(symbol, start_str, timeframe):
client = Client()
start_str = str(start_str)
end_str = f"{datetime.now()}"
df = pd.DataFrame(
client.get_historical_klines(
symbol=symbol, interval=timeframe, start_str=start_str, end_str=end_str
)
).astype(float)
df = df.iloc[:, :6]
df.columns = ["timestamp", "open", "high", "low", "close", "volume"]
df = df.set_index("timestamp")
df.index = pd.to_datetime(df.index, unit="ms").strftime("%Y-%m-%d %H:%M:%S")
return df
df = import_data("STPTUSDT", "2024-05-12", "15m")
fig = go.Figure(
data=[
go.Candlestick(
x=df.index,
open=df["open"],
high=df["high"],
low=df["low"],
close=df["close"],
)
]
)
swing_highs_lows_data = smc.swing_highs_lows(df, swing_length=10)
ob_data = smc.ob(df, swing_highs_lows_data)
fig = add_OB(fig, ob_data)
fig.update_layout(xaxis_rangeslider_visible=False)
fig.update_layout(showlegend=False)
fig.update_layout(margin=dict(l=0, r=0, b=0, t=0))
fig.update_xaxes(visible=False, showticklabels=False)
fig.update_yaxes(visible=False, showticklabels=False)
fig.update_layout(plot_bgcolor="rgba(0,0,0,0)")
fig.update_layout(paper_bgcolor="rgba(94, 94, 134, 1)")
fig.update_layout(font=dict(color="white"))
fig.write_image("test_binance.png")
fig