Hi,
I think the code is doing something wrong because is not doing what I need. First I want to calculate the number of shares to buy in order to place the stop loss and Take profit and win or lose the same amount, in this case, $1000.
The code is not calculating well the # of shares and it seems the algo is doing the order, then the stop loss and then the take profit, this is wrong because what I need is one or the other, not the 2. Meaning either Stop Loss or Take Profit for any given order. Hope someone can help.
Is just a simple mean-reverting strategy.
import clr
clr.AddReference("System")
clr.AddReference("QuantConnect.Algorithm")
clr.AddReference("QuantConnect.Indicators")
clr.AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
class KeltnerMeanReversionAlgorithm(QCAlgorithm):
def Initialize(self):
'''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
self.SetStartDate(2018, 1, 1) #Set Start Date
#self.SetEndDate(2015, 1, 1) #Set End Date
self.SetCash(100000) #Set Strategy Cash
# Find more symbols here: http://quantconnect.com/data
self.AddEquity("SPY")
# create the 20 EMA
self.mean = self.EMA("SPY", 20, Resolution.Daily)
# create the ATR
self.atr = self.ATR("SPY", 20, Resolution.Daily)
self.previous = None
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.'''
# a couple things to notice in this method:
# 1. We never need to 'update' our indicators with the data, the engine takes care of this for us
# 2. We can use indicators directly in math expressions
# 3. We can easily plot many indicators at the same time
# wait for our ema to fully initialize
if not self.mean.IsReady:
return
# only once per day
if self.previous is not None and self.previous.date() == self.Time.date():
return
risk_per_trade = 100
holdings = self.Portfolio["SPY"].Quantity
# If there is no trades
if holdings == 0:
quantity = round(risk_per_trade / self.atr.Current.Value)
# Mean reversion when price is too low
if self.Securities["SPY"].Price < self.mean.Current.Value - 2 * self.atr.Current.Value:
self.Log("BUY >> {0}".format(self.Securities["SPY"].Price))
marketTicket = self.MarketOrder("SPY", quantity)
limitTicket = self.LimitOrder("SPY", -self.Portfolio['SPY'].Quantity, self.Securities["SPY"].Price + self.atr.Current.Value)
stopTicket = self.StopMarketOrder("SPY", -self.Portfolio['SPY'].Quantity, self.Securities["SPY"].Price - self.atr.Current.Value)
# Mean reversion when price is too high
if self.Securities["SPY"].Price > self.mean.Current.Value + 2 * self.atr.Current.Value:
self.Log("SELL >> {0}".format(self.Securities["SPY"].Price))
marketTicket = self.MarketOrder("SPY", -quantity)
limitTicket = self.LimitOrder("SPY", self.Portfolio['SPY'].Quantity, self.Securities["SPY"].Price - self.atr.Current.Value)
stopTicket = self.StopMarketOrder("SPY", self.Portfolio['SPY'].Quantity, self.Securities["SPY"].Price + self.atr.Current.Value)
self.previous = self.Time