import streamlit as st import yfinance as yf import pandas as pd import plotly.graph_objects as go import numpy as np st.sidebar.title('Bali Scalping Strategy Analyzer') ticker = st.sidebar.text_input('Enter ticker symbol', 'AAPL') start_date = st.sidebar.date_input('Start date', pd.to_datetime('2020-01-01')) end_date = st.sidebar.date_input('End date', pd.to_datetime('2020-12-31')) time_frame = st.sidebar.selectbox('Select time frame', ['60m', '1d']) analyze_button = st.sidebar.button('Analyze') st.title('Bali Scalping Strategy Visualization') st.markdown(""" This app visualizes the 'Bali' scalping strategy with buy and sell signals. Enter the stock ticker, select the date range and time frame, and click 'Analyze'. """) def fetch_data(ticker, start_date, end_date, interval): data = yf.download(ticker, start=start_date, end=end_date, interval=interval) return data def calculate_lwma(data, period=48): weights = np.arange(1, period + 1) return data.rolling(window=period).apply(lambda prices: np.dot(prices, weights) / weights.sum(), raw=True) def calculate_trend_envelopes(data, period=2): ma = data.rolling(window=period).mean() deviation = data.rolling(window=period).std() upper_band = ma + (0.02 * deviation) lower_band = ma - (0.02 * deviation) return upper_band, lower_band def calculate_dss(data, period=10): stoch = ((data - data.rolling(window=period).min()) / (data.rolling(window=period).max() - data.rolling(window=period).min())) * 100 dss = stoch.rolling(window=period).mean() return dss if analyze_button: data = fetch_data(ticker, start_date, end_date, time_frame) data['LWMA'] = calculate_lwma(data['Close']) upper_band, lower_band = calculate_trend_envelopes(data['Close']) data['DSS'] = calculate_dss(data['Close']) data['Buy'] = ((data['Close'] > data['LWMA']) & (data['Close'] > upper_band.shift()) & (data['DSS'] > 80)) data['Sell'] = ((data['Close'] < data['LWMA']) & (data['Close'] < lower_band.shift()) & (data['DSS'] < 20)) fig = go.Figure() fig.add_trace(go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], name="Candlestick")) fig.add_trace(go.Scatter(x=data.index, y=data['LWMA'], line=dict(color='red', width=1.5), name='LWMA')) fig.add_trace(go.Scatter(x=data.index, y=upper_band, line=dict(color='blue', width=0.7), name='Upper Band')) fig.add_trace(go.Scatter(x=data.index, y=lower_band, line=dict(color='orange', width=0.7), name='Lower Band')) buy_signals = data[data['Buy']] sell_signals = data[data['Sell']] fig.add_trace(go.Scatter(x=buy_signals.index, y=buy_signals['Close'], mode='markers', marker_symbol='triangle-up', marker_line_color="green", marker_color="green", marker_line_width=2, marker_size=10, name='Buy Signal')) fig.add_trace(go.Scatter(x=sell_signals.index, y=sell_signals['Close'], mode='markers', marker_symbol='triangle-down', marker_line_color="red", marker_color="red", marker_line_width=2, marker_size=10, name='Sell Signal')) fig.update_layout(title='Bali Scalping Strategy Visualization', xaxis_title='Date', yaxis_title='Price', xaxis_rangeslider_visible=False) st.plotly_chart(fig, use_container_width=True)