From 86675d64d0910b7fa9d4f75e26cc18e51ad86caa Mon Sep 17 00:00:00 2001 From: cardosofede Date: Tue, 23 Jul 2024 15:01:40 +0300 Subject: [PATCH] (feat) update directional trading --- pages/config/bollinger_v1/app.py | 20 ++++++------ pages/config/bollinger_v1/user_inputs.py | 4 ++- pages/config/kalman_filter_v1/app.py | 40 +++++++++++++---------- pages/config/macd_bb_v1/app.py | 19 ++++++----- pages/config/macd_bb_v1/user_inputs.py | 4 ++- pages/config/supertrend_v1/app.py | 13 ++++---- pages/config/supertrend_v1/user_inputs.py | 4 ++- 7 files changed, 58 insertions(+), 46 deletions(-) diff --git a/pages/config/bollinger_v1/app.py b/pages/config/bollinger_v1/app.py index b0bbdd0..977c26e 100644 --- a/pages/config/bollinger_v1/app.py +++ b/pages/config/bollinger_v1/app.py @@ -1,18 +1,16 @@ -import streamlit as st import pandas_ta as ta # noqa: F401 +import streamlit as st +from plotly.subplots import make_subplots from frontend.components.backtesting import backtesting_section from frontend.components.config_loader import get_default_config_loader from frontend.components.save_config import render_save_config -from frontend.pages.config.utils import get_candles -from frontend.st_utils import initialize_st_page, get_backend_api_client from frontend.pages.config.bollinger_v1.user_inputs import user_inputs -from plotly.subplots import make_subplots - +from frontend.pages.config.utils import get_candles +from frontend.st_utils import get_backend_api_client, initialize_st_page from frontend.visualization import theme from frontend.visualization.backtesting import create_backtesting_figure -from frontend.visualization.backtesting_metrics import render_backtesting_metrics, render_accuracy_metrics, \ - render_close_types +from frontend.visualization.backtesting_metrics import render_accuracy_metrics, render_backtesting_metrics, render_close_types from frontend.visualization.candles import get_candlestick_trace from frontend.visualization.indicators import get_bbands_traces, get_volume_trace from frontend.visualization.signals import get_bollinger_v1_signal_traces @@ -22,7 +20,6 @@ from frontend.visualization.utils import add_traces_to_fig initialize_st_page(title="Bollinger V1", icon="📈", initial_sidebar_state="expanded") backend_api_client = get_backend_api_client() - st.text("This tool will let you create a config for Bollinger V1 and visualize the strategy.") get_default_config_loader("bollinger_v1") @@ -32,7 +29,8 @@ st.session_state["default_config"].update(inputs) st.write("### Visualizing Bollinger Bands and Trading Signals") days_to_visualize = st.number_input("Days to Visualize", min_value=1, max_value=365, value=7) # Load candle data -candles = get_candles(connector_name=inputs["candles_connector"], trading_pair=inputs["candles_trading_pair"], interval=inputs["interval"], days=days_to_visualize) +candles = get_candles(connector_name=inputs["candles_connector"], trading_pair=inputs["candles_trading_pair"], + interval=inputs["interval"], days=days_to_visualize) # Create a subplot with 2 rows fig = make_subplots(rows=2, cols=1, shared_xaxes=True, @@ -41,7 +39,9 @@ fig = make_subplots(rows=2, cols=1, shared_xaxes=True, add_traces_to_fig(fig, [get_candlestick_trace(candles)], row=1, col=1) add_traces_to_fig(fig, get_bbands_traces(candles, inputs["bb_length"], inputs["bb_std"]), row=1, col=1) -add_traces_to_fig(fig, get_bollinger_v1_signal_traces(candles, inputs["bb_length"], inputs["bb_std"], inputs["bb_long_threshold"], inputs["bb_short_threshold"]), row=1, col=1) +add_traces_to_fig(fig, get_bollinger_v1_signal_traces(candles, inputs["bb_length"], inputs["bb_std"], + inputs["bb_long_threshold"], inputs["bb_short_threshold"]), row=1, + col=1) add_traces_to_fig(fig, [get_volume_trace(candles)], row=2, col=1) fig.update_layout(**theme.get_default_layout()) diff --git a/pages/config/bollinger_v1/user_inputs.py b/pages/config/bollinger_v1/user_inputs.py index 8bc8988..d5a7e0a 100644 --- a/pages/config/bollinger_v1/user_inputs.py +++ b/pages/config/bollinger_v1/user_inputs.py @@ -1,4 +1,5 @@ import streamlit as st + from frontend.components.directional_trading_general_inputs import get_directional_trading_general_inputs from frontend.components.risk_management import get_risk_management_inputs @@ -9,7 +10,8 @@ def user_inputs(): bb_std = default_config.get("bb_std", 2.0) bb_long_threshold = default_config.get("bb_long_threshold", 0.0) bb_short_threshold = default_config.get("bb_short_threshold", 1.0) - connector_name, trading_pair, leverage, total_amount_quote, max_executors_per_side, cooldown_time, position_mode, candles_connector_name, candles_trading_pair, interval = get_directional_trading_general_inputs() + connector_name, trading_pair, leverage, total_amount_quote, max_executors_per_side, cooldown_time, position_mode, \ + candles_connector_name, candles_trading_pair, interval = get_directional_trading_general_inputs() sl, tp, time_limit, ts_ap, ts_delta, take_profit_order_type = get_risk_management_inputs() with st.expander("Bollinger Bands Configuration", expanded=True): c1, c2, c3, c4 = st.columns(4) diff --git a/pages/config/kalman_filter_v1/app.py b/pages/config/kalman_filter_v1/app.py index 2479d18..08749dc 100644 --- a/pages/config/kalman_filter_v1/app.py +++ b/pages/config/kalman_filter_v1/app.py @@ -1,13 +1,14 @@ -import streamlit as st import pandas as pd import plotly.graph_objects as go +import streamlit as st import yaml from hummingbot.connector.connector_base import OrderType +from plotly.subplots import make_subplots from pykalman import KalmanFilter -from CONFIG import BACKEND_API_HOST, BACKEND_API_PORT from backend.services.backend_api_client import BackendAPIClient -from frontend.st_utils import initialize_st_page, get_backend_api_client +from CONFIG import BACKEND_API_HOST, BACKEND_API_PORT +from frontend.st_utils import get_backend_api_client, initialize_st_page # Initialize the Streamlit page initialize_st_page(title="Kalman Filter V1", icon="📈", initial_sidebar_state="expanded") @@ -18,6 +19,7 @@ def get_candles(connector_name="binance", trading_pair="BTC-USDT", interval="1m" backend_client = BackendAPIClient(BACKEND_API_HOST, BACKEND_API_PORT) return backend_client.get_real_time_candles(connector_name, trading_pair, interval, max_records) + @st.cache_data def add_indicators(df, observation_covariance=1, transition_covariance=0.01, initial_state_covariance=0.001): # Add Bollinger Bands @@ -61,7 +63,6 @@ with c3: with c4: max_records = st.number_input("Max Records", min_value=100, max_value=10000, value=1000) - st.write("## Positions Configuration") c1, c2, c3, c4 = st.columns(4) with c1: @@ -87,28 +88,25 @@ with c1: with c2: transition_covariance = st.number_input("Transition Covariance", value=0.001, step=0.0001, format="%.4f") - # Load candle data -candle_data = get_candles(connector_name=candles_connector, trading_pair=candles_trading_pair, interval=interval, max_records=max_records) +candle_data = get_candles(connector_name=candles_connector, trading_pair=candles_trading_pair, interval=interval, + max_records=max_records) df = pd.DataFrame(candle_data) df.index = pd.to_datetime(df['timestamp'], unit='s') candles_processed = add_indicators(df, observation_covariance, transition_covariance) - - # Prepare data for signals signals = candles_processed[candles_processed['signal'] != 0] buy_signals = signals[signals['signal'] == 1] sell_signals = signals[signals['signal'] == -1] -from plotly.subplots import make_subplots # Define your color palette tech_colors = { - 'upper_band': '#4682B4', # Steel Blue for the Upper Bollinger Band + 'upper_band': '#4682B4', # Steel Blue for the Upper Bollinger Band 'middle_band': '#FFD700', # Gold for the Middle Bollinger Band - 'lower_band': '#32CD32', # Green for the Lower Bollinger Band - 'buy_signal': '#1E90FF', # Dodger Blue for Buy Signals + 'lower_band': '#32CD32', # Green for the Lower Bollinger Band + 'buy_signal': '#1E90FF', # Dodger Blue for Buy Signals 'sell_signal': '#FF0000', # Red for Sell Signals } @@ -127,9 +125,15 @@ fig.add_trace(go.Candlestick(x=candles_processed.index, row=1, col=1) # Bollinger Bands -fig.add_trace(go.Scatter(x=candles_processed.index, y=candles_processed['kf_upper'], line=dict(color=tech_colors['upper_band']), name='Upper Band'), row=1, col=1) -fig.add_trace(go.Scatter(x=candles_processed.index, y=candles_processed['kf'], line=dict(color=tech_colors['middle_band']), name='Middle Band'), row=1, col=1) -fig.add_trace(go.Scatter(x=candles_processed.index, y=candles_processed['kf_lower'], line=dict(color=tech_colors['lower_band']), name='Lower Band'), row=1, col=1) +fig.add_trace( + go.Scatter(x=candles_processed.index, y=candles_processed['kf_upper'], line=dict(color=tech_colors['upper_band']), + name='Upper Band'), row=1, col=1) +fig.add_trace( + go.Scatter(x=candles_processed.index, y=candles_processed['kf'], line=dict(color=tech_colors['middle_band']), + name='Middle Band'), row=1, col=1) +fig.add_trace( + go.Scatter(x=candles_processed.index, y=candles_processed['kf_lower'], line=dict(color=tech_colors['lower_band']), + name='Lower Band'), row=1, col=1) # Signals plot fig.add_trace(go.Scatter(x=buy_signals.index, y=buy_signals['close'], mode='markers', @@ -140,7 +144,8 @@ fig.add_trace(go.Scatter(x=sell_signals.index, y=sell_signals['close'], mode='ma name='Sell Signal'), row=1, col=1) fig.add_trace(go.Scatter(x=signals.index, y=signals['signal'], mode='markers', - marker=dict(color=signals['signal'].map({1: tech_colors['buy_signal'], -1: tech_colors['sell_signal']}), size=10), + marker=dict(color=signals['signal'].map( + {1: tech_colors['buy_signal'], -1: tech_colors['sell_signal']}), size=10), showlegend=False), row=2, col=1) # Update layout @@ -218,8 +223,7 @@ with c3: ) upload_config_to_backend = st.button("Upload Config to BackendAPI") - if upload_config_to_backend: backend_api_client = get_backend_api_client() backend_api_client.add_controller_config(config) - st.success("Config uploaded successfully!") \ No newline at end of file + st.success("Config uploaded successfully!") diff --git a/pages/config/macd_bb_v1/app.py b/pages/config/macd_bb_v1/app.py index 3857587..0237292 100644 --- a/pages/config/macd_bb_v1/app.py +++ b/pages/config/macd_bb_v1/app.py @@ -6,11 +6,10 @@ from frontend.components.config_loader import get_default_config_loader from frontend.components.save_config import render_save_config from frontend.pages.config.macd_bb_v1.user_inputs import user_inputs from frontend.pages.config.utils import get_candles -from frontend.st_utils import initialize_st_page, get_backend_api_client +from frontend.st_utils import get_backend_api_client, initialize_st_page from frontend.visualization import theme from frontend.visualization.backtesting import create_backtesting_figure -from frontend.visualization.backtesting_metrics import render_backtesting_metrics, render_accuracy_metrics, \ - render_close_types +from frontend.visualization.backtesting_metrics import render_accuracy_metrics, render_backtesting_metrics, render_close_types from frontend.visualization.candles import get_candlestick_trace from frontend.visualization.indicators import get_bbands_traces, get_macd_traces from frontend.visualization.signals import get_macdbb_v1_signal_traces @@ -25,11 +24,11 @@ get_default_config_loader("macd_bb_v1") inputs = user_inputs() st.session_state["default_config"].update(inputs) - st.write("### Visualizing MACD Bollinger Trading Signals") days_to_visualize = st.number_input("Days to Visualize", min_value=1, max_value=365, value=7) # Load candle data -candles = get_candles(connector_name=inputs["candles_connector"], trading_pair=inputs["candles_trading_pair"], interval=inputs["interval"], days=days_to_visualize) +candles = get_candles(connector_name=inputs["candles_connector"], trading_pair=inputs["candles_trading_pair"], + interval=inputs["interval"], days=days_to_visualize) # Create a subplot with 2 rows fig = make_subplots(rows=2, cols=1, shared_xaxes=True, @@ -38,9 +37,12 @@ fig = make_subplots(rows=2, cols=1, shared_xaxes=True, add_traces_to_fig(fig, [get_candlestick_trace(candles)], row=1, col=1) add_traces_to_fig(fig, get_bbands_traces(candles, inputs["bb_length"], inputs["bb_std"]), row=1, col=1) add_traces_to_fig(fig, get_macdbb_v1_signal_traces(df=candles, bb_length=inputs["bb_length"], bb_std=inputs["bb_std"], - bb_long_threshold=inputs["bb_long_threshold"], bb_short_threshold=inputs["bb_short_threshold"], - macd_fast=inputs["macd_fast"], macd_slow=inputs["macd_slow"], macd_signal=inputs["macd_signal"]), row=1, col=1) -add_traces_to_fig(fig, get_macd_traces(df=candles, macd_fast=inputs["macd_fast"], macd_slow=inputs["macd_slow"], macd_signal=inputs["macd_signal"]), row=2, col=1) + bb_long_threshold=inputs["bb_long_threshold"], + bb_short_threshold=inputs["bb_short_threshold"], + macd_fast=inputs["macd_fast"], macd_slow=inputs["macd_slow"], + macd_signal=inputs["macd_signal"]), row=1, col=1) +add_traces_to_fig(fig, get_macd_traces(df=candles, macd_fast=inputs["macd_fast"], macd_slow=inputs["macd_slow"], + macd_signal=inputs["macd_signal"]), row=2, col=1) fig.update_layout(**theme.get_default_layout()) # Use Streamlit's functionality to display the plot @@ -61,4 +63,3 @@ if bt_results: render_close_types(bt_results["results"]) st.write("---") render_save_config(st.session_state["default_config"]["id"], st.session_state["default_config"]) - diff --git a/pages/config/macd_bb_v1/user_inputs.py b/pages/config/macd_bb_v1/user_inputs.py index 3e7e212..b928a82 100644 --- a/pages/config/macd_bb_v1/user_inputs.py +++ b/pages/config/macd_bb_v1/user_inputs.py @@ -1,4 +1,5 @@ import streamlit as st + from frontend.components.directional_trading_general_inputs import get_directional_trading_general_inputs from frontend.components.risk_management import get_risk_management_inputs @@ -12,7 +13,8 @@ def user_inputs(): macd_fast = default_config.get("macd_fast", 21) macd_slow = default_config.get("macd_slow", 42) macd_signal = default_config.get("macd_signal", 9) - connector_name, trading_pair, leverage, total_amount_quote, max_executors_per_side, cooldown_time, position_mode, candles_connector_name, candles_trading_pair, interval = get_directional_trading_general_inputs() + connector_name, trading_pair, leverage, total_amount_quote, max_executors_per_side, cooldown_time, position_mode,\ + candles_connector_name, candles_trading_pair, interval = get_directional_trading_general_inputs() sl, tp, time_limit, ts_ap, ts_delta, take_profit_order_type = get_risk_management_inputs() with st.expander("MACD Bollinger Configuration", expanded=True): c1, c2, c3, c4, c5, c6, c7 = st.columns(7) diff --git a/pages/config/supertrend_v1/app.py b/pages/config/supertrend_v1/app.py index 83e6633..97e68bf 100644 --- a/pages/config/supertrend_v1/app.py +++ b/pages/config/supertrend_v1/app.py @@ -6,13 +6,12 @@ from frontend.components.config_loader import get_default_config_loader from frontend.components.save_config import render_save_config from frontend.pages.config.supertrend_v1.user_inputs import user_inputs from frontend.pages.config.utils import get_candles -from frontend.st_utils import initialize_st_page, get_backend_api_client +from frontend.st_utils import get_backend_api_client, initialize_st_page from frontend.visualization import theme from frontend.visualization.backtesting import create_backtesting_figure -from frontend.visualization.backtesting_metrics import render_backtesting_metrics, render_accuracy_metrics, \ - render_close_types +from frontend.visualization.backtesting_metrics import render_accuracy_metrics, render_backtesting_metrics, render_close_types from frontend.visualization.candles import get_candlestick_trace -from frontend.visualization.indicators import get_volume_trace, get_supertrend_traces +from frontend.visualization.indicators import get_supertrend_traces, get_volume_trace from frontend.visualization.signals import get_supertrend_v1_signal_traces from frontend.visualization.utils import add_traces_to_fig @@ -28,7 +27,8 @@ st.session_state["default_config"].update(inputs) st.write("### Visualizing Supertrend Trading Signals") days_to_visualize = st.number_input("Days to Visualize", min_value=1, max_value=365, value=7) # Load candle data -candles = get_candles(connector_name=inputs["candles_connector"], trading_pair=inputs["candles_trading_pair"], interval=inputs["interval"], days=days_to_visualize) +candles = get_candles(connector_name=inputs["candles_connector"], trading_pair=inputs["candles_trading_pair"], + interval=inputs["interval"], days=days_to_visualize) # Create a subplot with 2 rows fig = make_subplots(rows=2, cols=1, shared_xaxes=True, @@ -36,7 +36,8 @@ fig = make_subplots(rows=2, cols=1, shared_xaxes=True, row_heights=[0.8, 0.2]) add_traces_to_fig(fig, [get_candlestick_trace(candles)], row=1, col=1) add_traces_to_fig(fig, get_supertrend_traces(candles, inputs["length"], inputs["multiplier"]), row=1, col=1) -add_traces_to_fig(fig, get_supertrend_v1_signal_traces(candles, inputs["length"], inputs["multiplier"], inputs["percentage_threshold"]), row=1, col=1) +add_traces_to_fig(fig, get_supertrend_v1_signal_traces(candles, inputs["length"], inputs["multiplier"], + inputs["percentage_threshold"]), row=1, col=1) add_traces_to_fig(fig, [get_volume_trace(candles)], row=2, col=1) layout_settings = theme.get_default_layout() diff --git a/pages/config/supertrend_v1/user_inputs.py b/pages/config/supertrend_v1/user_inputs.py index 05245eb..d4a9436 100644 --- a/pages/config/supertrend_v1/user_inputs.py +++ b/pages/config/supertrend_v1/user_inputs.py @@ -1,4 +1,5 @@ import streamlit as st + from frontend.components.directional_trading_general_inputs import get_directional_trading_general_inputs from frontend.components.risk_management import get_risk_management_inputs @@ -8,7 +9,8 @@ def user_inputs(): length = default_config.get("length", 20) multiplier = default_config.get("multiplier", 3.0) percentage_threshold = default_config.get("percentage_threshold", 0.5) - connector_name, trading_pair, leverage, total_amount_quote, max_executors_per_side, cooldown_time, position_mode, candles_connector_name, candles_trading_pair, interval = get_directional_trading_general_inputs() + connector_name, trading_pair, leverage, total_amount_quote, max_executors_per_side, cooldown_time, position_mode, \ + candles_connector_name, candles_trading_pair, interval = get_directional_trading_general_inputs() sl, tp, time_limit, ts_ap, ts_delta, take_profit_order_type = get_risk_management_inputs() with st.expander("SuperTrend Configuration", expanded=True):