Technical Analysis Using MACD and Lumibot

Share This Post

Introduction

Are you struggling to optimize your trading bot’s performance? MACD, or Moving Average Convergence Divergence, can be a powerful tool to help you address common challenges in automated trading. By identifying potential trend reversals, overbought or oversold conditions, and generating trading signals, MACD can provide valuable insights for your bot’s decision-making process.
Lumibot, a leading trading bot platform, offers seamless integration with MACD, allowing you to leverage its capabilities to enhance your trading strategies. With Lumibot, you can easily incorporate MACD into your bot’s logic, making informed decisions based on real-time market data.
Let’s read on to find out how to effectively use MACD in your trading bot.

Five Applications of MACD in Trading Bots

MACD, a versatile technical indicator, offers a wealth of insights for traders. Let’s read on to explore five key applications that can help you make informed decisions and enhance your trading strategies.

1. Trend Reversal Detection

  • Bullish Crossovers: When the MACD line crosses above the signal line, it suggests a potential uptrend reversal. A trading bot can be programmed to automatically initiate long positions when this occurs.
  • Bearish Crossovers: When the MACD line crosses below the signal line, it suggests a potential downtrend reversal. A trading bot can be programmed to automatically initiate short positions or close existing long positions based on this signal.

2. Overbought/Oversold Indicators

  • Positive Histogram: A significantly positive MACD histogram indicates that the asset may be overbought, suggesting a potential pullback or correction. A trading bot can be programmed to reduce existing long positions or avoid entering new long positions when the histogram reaches a predetermined threshold.
  • Negative Histogram: A significantly negative MACD histogram indicates that the asset may be oversold, suggesting a potential rebound. A trading bot can be programmed to initiate long positions or reduce existing short positions based on this signal.

3. Divergence Detection

  • Positive Divergence: When the price makes a new low, but the MACD fails to make a new low (positive divergence), it can signal a potential bullish reversal. A trading bot can be programmed to automatically initiate long positions or reduce existing short positions based on this divergence.
  • Negative Divergence: When the price makes a new high, but the MACD fails to make a new high (negative divergence), it can signal a potential bearish reversal. A trading bot can be programmed to automatically initiate short positions or reduce existing long positions based on this divergence.

4. Momentum Confirmation

  • Upward Sloping MACD: When the MACD line is above the signal line and moving upward, it confirms an uptrend. A trading bot can be programmed to maintain or increase existing long positions based on this signal.
  • Downward Sloping MACD: When the MACD line is below the signal line and moving downward, it confirms a downtrend. A trading bot can be programmed to maintain or increase existing short positions based on this signal.

5. Trading Strategy Development

  • Combination with Other Indicators: MACD can be combined with other technical indicators, such as RSI, Bollinger Bands, or support and resistance levels, to develop more complex trading strategies. A trading bot can be programmed to execute trades based on a combination of these indicators.
  • Backtesting and Optimization: Traders can backtest their MACD-based trading strategies using historical data to evaluate their performance and optimize parameters like the fast and slow EMAs and the signal line period. A trading bot can be programmed to continuously backtest and optimize its trading strategy based on historical data.

Risk Management: To mitigate potential losses, it’s essential to incorporate risk management techniques, such as stop-loss orders and position sizing when using MACD in trading bots. A trading bot can be programmed to automatically implement stop-loss orders and adjust position sizes based on predefined criteria.

Steps To Get the MACD(Moving Average Convergence Divergence) of the Historical Price of an Asset with Lumibot

Prerequisites

Must have Python installed in the system(version 3.10 or above)

  1. Install required Python packages.

 pip install lumibot


2. Necessary imports for running the Python file.


from lumibot.strategies import Strategy

3. Create ALPACA_CONFIG with API KEY and API SECRET by logging in or signing up at https://alpaca.markets/

Steps To Get the MACD (Moving Average Convergence Divergence) of an Asset with Lumibot

Step 1: Add ALPACA_CONFIG Details

Alpaca is a broker, just like the interactive broker. The details below are required to use the Alpaca broker API.

ALPACA_CONFIG = {
	"API_KEY": "YOUR_API_KEY_HERE", # Get your API Key from https://alpaca.markets/
	"API_SECRET": "YOUR_SECRET_HERE", # Get your secret from https://alpaca.markets/
	"PAPER":True # Set to False for real money
}

Step 2: Create a GetHistoricalPrice Class 

Once you have added the Alpaca config detail, create a GetHistoricalPrice class, which will inherit the Strategy class as below.

class GetHistoricalPrice(Strategy):

Step 3: Add on_trading_iteration() Method

Once you have added the initialize method, follow with the creation of  on_trading_iteration() method as below:

   def on_trading_iteration(self):

        bars = self.get_historical_prices("AAPL", 50, "day")  # Ensure enough data for MACD
        df = bars.df

        # Calculate MACD values
        macd = ta.macd(df['close'])
        df['MACD'] = macd['MACD_12_26_9']
        df['MACD_Signal'] = macd['MACDs_12_26_9']
        df['MACD_Hist'] = macd['MACDh_12_26_9']

        # Drop any rows with NaN values that could cause errors
        df.dropna(inplace=True)

        print(df)





The provided code calculates the MACD values for Apple stock based on historical price data. It first fetches the necessary data, creates a DataFrame, and then uses the ta.macd function to calculate the MACD line, signal line, and histogram. Finally, it removes any rows with missing values and prints the resulting DataFrame for inspection. This DataFrame can be used for further analysis or to generate trading signals based on the calculated MACD values.

Note 1: Running the Code in the Same File 

In Python, if __name__ == “__main__”: is a conditional statement, which allows you to control the execution of code depending on whether the script is run directly or imported as a module. This implies that the code will run only if runs as a script and not as a module. 

if __name__ == "__main__": 

Step 4: Import Alpaca and Trader 

Import Alpaca and Trader classes from Lumibot.brokers and Lumibot.traders modules. While Alpaca is an interface to the Alpaca trading platform, it leverages us with the functionalities to interact with the Alpaca API for implementing things like placing orders, managing positions, and fetching market data like Historical Price Data, which we are doing in this blog.

The Trader class helps orchestrate the trading process, managing multiple trading strategies, interacting with brokers like Alpaca, Interactive Brokers, and Tradiers, handling order execution and position management, and ensuring a framework for live trading and backtesting. 

from lumibot.brokers import Alpaca
from lumibot.traders import Trader

Step 5: Create Trader Class Object

As you import the Alpaca and Trader class, create the trader object of the Trader() class.

 trader = Trader()

Step 6: Create an Object of Alpaca Class

On creation of the trader class object, create the object of the Alpaca class by passing the Alpaca_Config array created above.

broker = Alpaca(ALPACA_CONFIG)

Step 7: Create an Object of GetHistoricalPrice Class

Once we have created the object for the Alpaca class, we will create an object of the GetHistoricalPrice class by passing the Alpaca object (broker) as a parameter to the GetHistoricalPrice class. 

 strategy = GetHistoricalPrice(broker=broker)

Step 8: Pass the Strategy to the Trader Class Object

On creation of the object of the GetHistoricalPrice class, add the strategy to the trader class object using the add_strategy() method.

trader.add_strategy(strategy)

Step 9: Start the Overall Trading Process

The code below starts the overall trading process. This typically executes backtesting or a live trading process for a collection of strategies within a trading platform. This command starts the execution engine. It establishes the connection with a broker, which is Alpaca, and starts background tasks like market data ingestion and order management. Briefly, it is the starting point of the trading process.

trader.run_all()

Complete Code

Below is the entire code. Simply paste the code below in a gethistprice.py file, add the Alpaca API and secret keys, install the prerequisites, and run the code. However, ensure the market is open, which applies to US markets. The pre-trading hours start at 4 a.m. and end at 9:30 a.m. The regular trading hours begin at 9:30 a.m. and end at 4 p.m., and the after-trading hours last from 4 p.m. to 8 p.m. All timings are in Eastern Time (ET). Run the below code during regular trading hours.

from lumibot.strategies import Strategy
import pandas_ta as ta

# Alpaca API configuration
ALPACA_CONFIG = {
    "API_KEY": "YOUR_API_KEY_HERE", # Get your API Key from
https://alpaca.markets/
    "API_SECRET": "YOUR_SECRET_HERE", # Get your secret from
https://alpaca.markets/
    "PAPER":True # Set to False for real money
}
class GetHistoricalPrice(Strategy):

    def on_trading_iteration(self):

        bars = self.get_historical_prices("AAPL", 50, "day")  # Ensure enough data for MACD
        df = bars.df

        # Calculate MACD values
        macd = ta.macd(df['close'])
        df['MACD'] = macd['MACD_12_26_9']
        df['MACD_Signal'] = macd['MACDs_12_26_9']
        df['MACD_Hist'] = macd['MACDh_12_26_9']

        # Drop any rows with NaN values that could cause errors
        df.dropna(inplace=True)

        print(df)


if __name__ == "__main__":

    from lumibot.brokers import Alpaca
    from lumibot.traders import Trader

    broker = Alpaca(ALPACA_CONFIG)
    strategy = GetHistoricalPrice(broker=broker)
    
    trader = Trader()
    trader.add_strategy(strategy)
    trader.run_all()

Output

Conclusion

By effectively integrating MACD into a trading bot, traders can automate their trading strategies and improve their trading results. However, it’s important to note that no trading strategy is foolproof, and it’s essential to conduct thorough backtesting and risk management to minimize losses. Ready to leverage the power of MACD and other technical indicators in your trading bot? Lumibot offers a robust platform with easy-to-use APIs and comprehensive documentation to help you build and deploy sophisticated trading strategies. Start your journey towards automated trading success with Lumibot today!


Bonus

Did you enjoy this article? If yes then you’ll probably also love our courses. We teach people how to use software code to improve their stock, options, crypto, futures, and FOREX trading. It’s really easy (and free) to get started, just enter your name, email, and phone number into the form below:

Become A Master Of Trading By Creating Your Own High-Performing Trading Bots

Want to learn how to use Python to create your own algorithmic trading bots? Then sign up below to get access to our free class!


More To Explore

Lumiweath
Uncategorized

How to Place an Iron Condor Order With Lumibot?

Introduction In the realm of options trading, there are a multitude of strategies available to fit different market scenarios and trader objectives. One of the

Integrating Lumibot with Tradier_ A Practical Guide
Uncategorized

Integrating Lumibot with Tradier: A Practical Guide

Introduction In the fast-paced world of financial markets, automation is becoming essential for traders seeking to optimize their strategies, minimize risk, and capitalize on market

Want to learn more?

Book a free call with one of our experts