File size: 4,705 Bytes
c3fc9c2
 
 
 
 
a047e89
c3fc9c2
 
026493b
 
 
 
 
 
 
 
c3fc9c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
026493b
 
c3fc9c2
 
 
 
 
026493b
 
c3fc9c2
026493b
 
c3fc9c2
d3b64d7
e1ef946
d3b64d7
c3fc9c2
026493b
 
 
 
 
 
 
 
 
c3fc9c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
026493b
d3b64d7
026493b
c3fc9c2
61e998e
 
c3fc9c2
61e998e
c3fc9c2
 
61e998e
d3b64d7
e1ef946
 
 
61e998e
e1ef946
 
c3fc9c2
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import pandas as pd
import streamlit as st
from streamlit.components import v1 as components

from indicators import SMC
from src.utils import fetch, run_strategy

def algorithmic_trading_dashboard():
    @st.cache_data
    def load_data():
        # Load data
        symbols = pd.read_csv('data/Ticker_List_NSE_India.csv')
        limits = pd.read_csv('data/yahoo_limits.csv')
        return symbols, limits

    symbols, limits = load_data()

    # Dropdown options
    period_list = ['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']

    st.markdown(
        """
        # Algorithmic Trading Dashboard
        ## Run Strategy
        """
    )

    # Input fields on the main page

    # Select stock
    stock = st.selectbox("Select Company", symbols['NAME OF COMPANY'].unique(), index=None)

    c1, c2 = st.columns(2)

    with c1:
        # Select interval
        interval = st.selectbox("Select Interval", limits['interval'].tolist(), index=3)

    with c2:
        # Update period options based on interval
        limit = limits[limits['interval'] == interval]['limit'].values[0]
        idx = period_list.index(limit)
        period_options = period_list[:idx + 1] + ['max']
        period = st.selectbox("Select Period", period_options, index=3)

    c1, c2 = st.columns(2)

    with c1:
        # Select strategy
        strategy = st.selectbox("Select Strategy", ['Order Block', 'Order Block with EMA', 'Structure trading'], index=2)

    with c2:
        # Swing High/Low window size
        swing_hl = st.number_input("Swing High/Low Window Size", min_value=1, value=10,
                                   help = "Minimum window size for finding swing highs and lows.")

    # EMA parameters if "Order Block with EMA" is selected
    if strategy == "Order Block with EMA":
        c1, c2, c3 = st.columns(3)
        with c1:
            ema1 = st.number_input("Fast EMA Length", min_value=1, value=9,
                                   help = "Length of Fast moving Exponential Moving Average.")
        with c2:
            ema2 = st.number_input("Slow EMA Length", min_value=1, value=21,
                                   help = "Length of Slow moving Exponential Moving Average.")
        with c3:
            close_on_crossover = st.checkbox("Close trade on EMA crossover", value=False)
    else:
        ema1, ema2, close_on_crossover = None, None, None

    with st.expander("Advanced options"):
        c1, c2 = st.columns(2)
        with c1:
            initial_cash = st.number_input("Initial Cash [₹]", min_value=10000, value=10000)
        with c2:
            commission = st.number_input("Commission [%]", value = 0, min_value=-10, max_value=10,
                                         help="Commission is the commission ratio. E.g. if your broker's "
                                              "commission is 1% of trade value, set commission to 1.")

    # Button to run the analysis
    if st.button("Run"):
        # Fetch ticker data
        ticker = symbols[symbols['NAME OF COMPANY'] == stock]['YahooEquiv'].values[0]
        data = fetch(ticker, period, interval)

        # Generate signal plot based on strategy
        if strategy == "Order Block" or strategy == "Order Block with EMA":
            signal_plot = (
                SMC(data=data, swing_hl_window_sz=swing_hl)
                .plot(order_blocks=True, swing_hl=True, show=False)
                .update_layout(title=dict(text=ticker))
            )
        else:
            signal_plot = (
                SMC(data=data, swing_hl_window_sz=swing_hl)
                .plot(swing_hl_v2=True, structure=True, show=False)
                .update_layout(title=dict(text=ticker))
            )

        backtest_results = run_strategy(ticker, strategy, period, interval,
                                swing_hl=swing_hl, ema1=ema1, ema2=ema2, close_on_crossover=close_on_crossover,
                                cash=initial_cash, commission=commission/100)

        color = "green" if backtest_results['Return [%]'].values[0] > 0 else "red"

        # Display plots
        st.write(f"### :{color}[Signal Plot]")
        st.plotly_chart(signal_plot, width=1200)

        st.write(f'### :{color}[Backtest Results]')
        cols = ['Stock', 'Sector', 'Start', 'End', 'Return [%]', 'Equity Final [₹]', 'Buy & Hold Return [%]', '# Trades',
                'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]']
        st.dataframe(backtest_results, hide_index=True, column_order=cols)

        st.write(f"### :{color}[Backtest Plot]")
        plot = backtest_results['plot']
        components.html(plot[0], height=1067)

algorithmic_trading_dashboard()