bali_scalping / app.py
netflypsb's picture
Create app.py
5080203 verified
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)