Supertrend Strategy with yfinance data
Here is a coding snippet of python based supertrend strategy implementing using placesmartorder function.
#Coded by Rajandran R - www.marketcalls.in / www.openalgo.in
from openalgo import api
import yfinance as yf
import pandas as pd
import numpy as np
import time
import threading
import os
# Get API key from openalgo portal
api_key = 'your_openalgo_apikey'
#set the StrategyName, broker code, Trading symbol, exchange, product and quantity
strategy = "Supertrend Python"
symbol = "RELIANCE" #OpenAlgo Symbol
exchange = "NSE"
product="MIS"
quantity = 1
#yfinance datafeed settings
yfsymbol = "RELIANCE.NS" #Yahoo Finance Datafeed Symbol
period = "1d"
timeframe = "1m"
#supertrend indicator inputs
atr_period = 5
atr_multiplier = 1.0
# Set the API Key
client = api(api_key=api_key, host='http://127.0.0.1:5000')
def Supertrend(df, atr_period, multiplier):
high = df['High']
low = df['Low']
close = df['Close']
# calculate ATR
price_diffs = [high - low, high - close.shift(), close.shift() - low]
true_range = pd.concat(price_diffs, axis=1)
true_range = true_range.abs().max(axis=1)
atr = true_range.ewm(alpha=1/atr_period, min_periods=atr_period).mean()
hl2 = (high + low) / 2
final_upperband = upperband = hl2 + (multiplier * atr)
final_lowerband = lowerband = hl2 - (multiplier * atr)
supertrend = [True] * len(df)
for i in range(1, len(df.index)):
curr, prev = i, i-1
if close.iloc[curr] > final_upperband.iloc[prev]:
supertrend[curr] = True
elif close.iloc[curr] < final_lowerband.iloc[prev]:
supertrend[curr] = False
else:
supertrend[curr] = supertrend[prev]
if supertrend[curr] == True and final_lowerband.iloc[curr] < final_lowerband.iloc[prev]:
final_lowerband.iat[curr] = final_lowerband.iat[prev]
if supertrend[curr] == False and final_upperband.iloc[curr] > final_upperband.iloc[prev]:
final_upperband.iat[curr] = final_upperband.iat[prev]
if supertrend[curr] == True:
final_upperband.iat[curr] = np.nan
else:
final_lowerband.iat[curr] = np.nan
return pd.DataFrame({
'Supertrend': supertrend,
'Final Lowerband': final_lowerband,
'Final Upperband': final_upperband
}, index=df.index)
def supertrend_strategy():
stock = yf.Ticker(yfsymbol)
position = 0
while True:
df = stock.history(period=period, interval=timeframe)
close = df['Close'].round(2)
supertrend = Supertrend(df, atr_period, atr_multiplier)
is_uptrend = supertrend['Supertrend']
longentry = is_uptrend.iloc[-2] and not is_uptrend.iloc[-3]
shortentry = is_uptrend.iloc[-3] and not is_uptrend.iloc[-2]
if longentry and position <= 0:
position = quantity
response = client.placesmartorder(
strategy=strategy,
symbol=symbol,
action="BUY",
exchange=exchange,
price_type="MARKET",
product=product,
quantity=quantity,
position_size=position
)
print("Buy Order Response:", response)
elif shortentry and position >= 0:
position = quantity * -1
response = client.placesmartorder(
strategy=strategy,
symbol=symbol,
action="SELL",
exchange=exchange,
price_type="MARKET",
product=product,
quantity=quantity,
position_size=position
)
print("Sell Order Response:", response)
print("Position:", position)
print("LTP:", close.iloc[-1])
print("Supertrend:", supertrend['Supertrend'].iloc[-2])
print("LowerBand:", supertrend['Final Lowerband'].iloc[-2].round(2))
print("UpperBand:", supertrend['Final Upperband'].iloc[-2].round(2))
print("longentry:", longentry)
print("shortentry:", shortentry)
time.sleep(15)
t = threading.Thread(target=supertrend_strategy)
t.start()
Last updated