eshan6704 commited on
Commit
2417ac7
·
verified ·
1 Parent(s): 7fd28c9

Update chart_builder.py

Browse files
Files changed (1) hide show
  1. chart_builder.py +76 -64
chart_builder.py CHANGED
@@ -1,79 +1,91 @@
1
  # chart_builder.py
2
  import plotly.graph_objs as go
3
- from indicator import (
4
- calc_macd, calc_rsi, calc_supertrend,
5
- calc_stochastic, calc_keltner, calc_zigzag,
6
- calc_swings
7
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
- def build_chart(df):
10
  fig = go.Figure()
11
 
12
- # =============================
13
- # MAIN PRICE PANEL
14
- # =============================
15
  fig.add_trace(go.Candlestick(
16
  x=df.index,
17
- open=df["Open"], high=df["High"],
18
- low=df["Low"], close=df["Close"],
19
- name="Price", yaxis="y"
 
 
 
 
20
  ))
21
 
22
- # Volume
23
- fig.add_trace(go.Bar(
24
- x=df.index, y=df["Volume"], name="Volume", yaxis="y2", opacity=0.3
25
- ))
26
-
27
- # =============================
28
- # INDICATORS
29
- # =============================
30
- rsi = calc_rsi(df)
31
- macd = calc_macd(df)
32
- st = calc_supertrend(df)
33
- stoch = calc_stochastic(df)
34
- kc = calc_keltner(df)
35
- zig = calc_zigzag(df)
36
- sw = calc_swings(df)
37
-
38
- # RSI Panel
39
- fig.add_trace(go.Scatter(x=df.index, y=rsi["RSI"], name="RSI", yaxis="y3"))
40
-
41
- # MACD Panel
42
- fig.add_trace(go.Scatter(x=df.index, y=macd["MACD"], name="MACD", yaxis="y4"))
43
- fig.add_trace(go.Scatter(x=df.index, y=macd["Signal"], name="Signal", yaxis="y4"))
44
- fig.add_trace(go.Bar(x=df.index, y=macd["Histogram"], name="Hist", yaxis="y4"))
45
-
46
- # Supertrend
47
- fig.add_trace(go.Scatter(x=df.index, y=st["Supertrend"], name="Supertrend", yaxis="y"))
48
-
49
- # Stoch
50
- fig.add_trace(go.Scatter(x=df.index, y=stoch["STOCH_K"], name="STOCH_K", yaxis="y5"))
51
- fig.add_trace(go.Scatter(x=df.index, y=stoch["STOCH_D"], name="STOCH_D", yaxis="y5"))
52
-
53
- # Keltner
54
- fig.add_trace(go.Scatter(x=df.index, y=kc["KC_UP"], name="KC UP", yaxis="y"))
55
- fig.add_trace(go.Scatter(x=df.index, y=kc["KC_MID"], name="KC MID", yaxis="y"))
56
- fig.add_trace(go.Scatter(x=df.index, y=kc["KC_LOW"], name="KC LOW", yaxis="y"))
57
-
58
- # ZigZag
59
- fig.add_trace(go.Scatter(x=df.index, y=zig["ZIGZAG"], name="ZIGZAG", yaxis="y"))
60
 
61
- # Swings
62
- fig.add_trace(go.Scatter(x=df.index, y=sw["SWING_HIGH"], name="Swing High", yaxis="y"))
63
- fig.add_trace(go.Scatter(x=df.index, y=sw["SWING_LOW"], name="Swing Low", yaxis="y"))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
- # =============================
66
- # LAYOUT
67
- # =============================
68
  fig.update_layout(
69
- height=1200,
70
- xaxis=dict(domain=[0, 1], rangeslider=dict(visible=False)),
71
- yaxis=dict(domain=[0.55, 1]), # Price
72
- yaxis2=dict(domain=[0.45, 0.55]), # Volume
73
- yaxis3=dict(domain=[0.30, 0.45]), # RSI
74
- yaxis4=dict(domain=[0.15, 0.30]), # MACD
75
- yaxis5=dict(domain=[0.00, 0.15]), # Stochastic
76
- showlegend=True
77
  )
78
 
 
79
  return fig.to_html(full_html=False)
 
1
  # chart_builder.py
2
  import plotly.graph_objs as go
3
+ import pandas as pd
4
+ from indicator import macd, rsi, supertrend, keltner_channel, zigzag, swing_high_low, stockstick
5
+
6
+ # ============================================================
7
+ # CHART BUILDER
8
+ # ============================================================
9
+
10
+ def build_chart(df, indicators=None, volume=True):
11
+ """
12
+ Build Plotly chart with multiple indicators.
13
+ df: DataFrame with OHLCV columns
14
+ indicators: list of indicator names to apply (str)
15
+ volume: bool, add volume bars
16
+ """
17
+ indicators = indicators or []
18
+
19
+ # Apply stockstick color
20
+ df = stockstick(df)
21
 
 
22
  fig = go.Figure()
23
 
24
+ # Candlestick trace
 
 
25
  fig.add_trace(go.Candlestick(
26
  x=df.index,
27
+ open=df['Open'],
28
+ high=df['High'],
29
+ low=df['Low'],
30
+ close=df['Close'],
31
+ name="Price",
32
+ increasing_line_color='green',
33
+ decreasing_line_color='red'
34
  ))
35
 
36
+ # Volume trace
37
+ if volume and 'Volume' in df.columns:
38
+ vol_scale = (df['Close'].max() - df['Close'].min()) / df['Volume'].max()
39
+ fig.add_trace(go.Bar(
40
+ x=df.index,
41
+ y=df['Volume']*vol_scale + df['Close'].min(),
42
+ marker_color='lightblue',
43
+ name='Volume',
44
+ yaxis='y2',
45
+ customdata=df['Volume'],
46
+ hovertemplate="Volume: %{customdata}<extra></extra>"
47
+ ))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
+ # Indicators
50
+ for ind in indicators:
51
+ if ind.lower() == 'macd':
52
+ df = macd(df)
53
+ fig.add_trace(go.Scatter(x=df.index, y=df['MACD'], name='MACD', line=dict(color='orange')))
54
+ fig.add_trace(go.Scatter(x=df.index, y=df['MACD_Signal'], name='MACD Signal', line=dict(color='blue', dash='dot')))
55
+ elif ind.lower() == 'rsi':
56
+ df = rsi(df)
57
+ fig.add_trace(go.Scatter(x=df.index, y=df['RSI'], name='RSI', line=dict(color='purple')))
58
+ elif ind.lower() == 'supertrend':
59
+ df = supertrend(df)
60
+ # color by trend
61
+ fig.add_trace(go.Scatter(
62
+ x=df.index,
63
+ y=df['Close'],
64
+ mode='lines',
65
+ line=dict(color='green'),
66
+ name='SuperTrend Up',
67
+ visible='legendonly'
68
+ ))
69
+ elif ind.lower() == 'keltner':
70
+ df = keltner_channel(df)
71
+ fig.add_trace(go.Scatter(x=df.index, y=df['KC_Upper'], line=dict(color='red', dash='dot'), name='KC Upper'))
72
+ fig.add_trace(go.Scatter(x=df.index, y=df['KC_Lower'], line=dict(color='green', dash='dot'), name='KC Lower'))
73
+ elif ind.lower() == 'zigzag':
74
+ df = zigzag(df)
75
+ fig.add_trace(go.Scatter(x=df.index, y=df['ZigZag'], line=dict(color='black'), name='ZigZag'))
76
+ elif ind.lower() == 'swing':
77
+ df = swing_high_low(df)
78
+ fig.add_trace(go.Scatter(x=df.index, y=df['Swing_High'], mode='markers', marker=dict(color='red', symbol='triangle-up'), name='Swing High'))
79
+ fig.add_trace(go.Scatter(x=df.index, y=df['Swing_Low'], mode='markers', marker=dict(color='green', symbol='triangle-down'), name='Swing Low'))
80
 
81
+ # Layout adjustments
 
 
82
  fig.update_layout(
83
+ xaxis_rangeslider_visible=False,
84
+ height=600,
85
+ yaxis=dict(title='Price'),
86
+ yaxis2=dict(title='Volume', overlaying='y', side='right', showgrid=False, range=[df['Close'].min(), df['Close'].max()]),
87
+ margin=dict(l=50, r=50, t=50, b=50)
 
 
 
88
  )
89
 
90
+ # Return HTML div
91
  return fig.to_html(full_html=False)