Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
from datetime import datetime, timedelta import numpy as np import decimal as d import dateutil from QuantConnect.Brokerages import * import pandas as pd class fifo: def __init__(self): self.data = [] def append(self, data): self.data.append(data) def pop(self): return self.data.pop(0) def length(self): return len(self.data) def data_list(self): return self.data def max_in_list(list): max_data = -999999 idx_max = 0 idx = 0 for i in list: if i > max_data: max_data = i idx_max = idx idx = idx + 1 return max_data, idx_max def min_in_list(list): min_data = 999999 idx_min = 0 idx = 0 for i in list: if i < min_data: min_data = i idx_min = idx idx = idx + 1 return min_data, idx_min def invalid_negative_value(): return -999999 def ignore_date(timestamp, datelist): currentdate = timestamp[:10] ocurrentdate = dateutil.parser.parse(currentdate) for date in datelist: odate = dateutil.parser.parse(date) if odate == ocurrentdate: return True return False class BasicTemplateAlgorithm(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.total_cash = 20000 self.SetStartDate(2019, 2, 3) # Set Start Date self.SetEndDate(2019, 7, 22) # Set End Date self.SetCash(self.total_cash) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage) self.capital_per_trade = 10000 # self.total_cash/2.0 self.instrument_list = [] self.instrument_list.append("GLD") self.instrument_list.append("SPY") for instrument in self.instrument_list: self.AddEquity(instrument, Resolution.Minute) # StopLoss and profit target not being used self.stop_loss = 1.5 self.profit_target = 5.0 self.first_profit_target = 1.0 self.first_pullback_target = 0.7 self.vma_period = 8 self.position_type = 1 self.ignoredatelist = [] self.ignoredatelist.append("2018-12-31") self.per_stop_loss = self.stop_loss / 100.0 self.per_profit_target = self.profit_target / 100.0 self.per_first_profit_target = self.first_profit_target / 100.0 self.per_first_pullback_target = self.first_pullback_target / 100.0 self.enter_price = 0.0 self.enter = False self.exit = False self.sl_exit_price = invalid_negative_value() self.target_exit_price = invalid_negative_value() self.prev_day_close = invalid_negative_value() self.partial_exit = False self.partial_entry = False self.first_target_exit_price = 0.0 self.first_pullback_entry_price = 0.0 # cols = ["Date", "Time", "Instrument", "RSI", "Prev_High", "Current Price", "Qty", "Target", # "SL"] # self.df_out = pd.DataFrame(columns=cols) dailyConsolidator = {} self.rsi = {} for instrument in self.instrument_list: dailyConsolidator[instrument] = TradeBarConsolidator(TimeSpan.FromDays(1)) self.SubscriptionManager.AddConsolidator(instrument, dailyConsolidator[instrument]) dailyConsolidator[instrument].DataConsolidated += self.dailyBarHandler self.rsi[instrument] = self.RSI(instrument, 20, MovingAverageType.Simple, Resolution.Daily) # self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(9,45),Action(self.vmaTimeframeHandler)) def dailyBarHandler(self, sender, bar): currentdatetime = str(self.Time) currentdate = currentdatetime[:10] currenttime = currentdatetime[11:20] ocurrentdate = dateutil.parser.parse(currentdate) printafterdate = "2018-11-18" odate = dateutil.parser.parse(printafterdate) self.Debug(str(self.Time) + ":CurrentTime " + str(currenttime) + ":CurrentBar " + str(bar.Symbol) + " bar high:" + str(bar.High)) instrument = str(bar.Symbol) if self.rsi[instrument].IsReady: # get the current RSI value rsi_value = self.rsi[instrument].Current.Value self.Debug(str(rsi_value)) # cols = ["Date", "Time", "Instrument", "RSI", "Prev_High", "Current Price", "Qty", "Target", # "SL"] # self.df_out.loc[len(self.df_out)] = [currentdate, currenttime, instrument, 0, bar.High, 0.0, # 0, 0.0, 0.0] # processafterdate = "2016-10-30" # oprocessdate = dateutil.parser.parse(processafterdate) # # if ocurrentdate > oprocessdate: # if ignore_date(str(self.Time), self.ignoredatelist) == False: # self.Debug("Aroon Prev Vidya:" + str(self.prev_vidya)) # # if not self.Portfolio.Invested: # low_per_diff = (self.prev_intraday_bar_low - self.prev_vidya) / self.prev_vidya # tech_cond1 = low_per_diff > self.diff_target # # tech_cond1 = True # tech_cond2 = (self.aroon_up > self.aroon_threshold) and ( # self.aroon_up > self.aroon_down) # if ocurrentdate > odate: # if (tech_cond1): # self.Debug(str(bar.EndTime) + ":" + "Tech1 condition met") # if (tech_cond2): # self.Debug(str(bar.EndTime) + ":" + "Tech2 condition met") # if (tech_cond1 and tech_cond2): # self.Debug(str(bar.EndTime) + ":" + "Aroon Low diff: " + str(low_per_diff)) # # self.Debug(str(bar.EndTime) + ":" + "Aroon Low diff: ") # self.enter = True # return # # if self.Portfolio.Invested: # high_per_diff = (self.prev_vidya - float(bar.High)) / float(bar.High) # exit_tech_cond1 = high_per_diff > self.diff_target # exit_tech_cond2 = (self.aroon_up < self.aroon_threshold) or ( # self.aroon_up < self.aroon_down) # exit_tech_cond4 = (float(bar.Close) > self.target_exit_price) # exit_tech_cond3 = (float(bar.Close) < self.sl_exit_price) # if ocurrentdate > odate: # if (exit_tech_cond1): # self.Debug(str(bar.EndTime) + ":" + "Exit Tech1 condition met") # if (exit_tech_cond2): # self.Debug(str(bar.EndTime) + ":" + "Exit Tech1 condition met") # if (exit_tech_cond3): # self.Debug(str(bar.EndTime) + ":" + "Exit Tech3 condition met") # if (exit_tech_cond4): # self.Debug(str(bar.EndTime) + ":" + "Exit Tech4 condition met") # if (exit_tech_cond1 or exit_tech_cond2 or exit_tech_cond3 or exit_tech_cond4): # self.Debug(str(bar.EndTime) + ":" + "Aroon High per diff: " + str(high_per_diff)) # self.exit = True # return # if ocurrentdate > odate: # self.Debug("Daily:"+ str(self.Time) + "Open:" + str(bar.Open) + "High:" + str( # bar.High) + # "Low:" + str(bar.Low) + "Close:" + str(bar.Close)) # self.Debug("Aroon_Up:" + str(self.aroon_up) + "Aroon_Down" + str(self.aroon_down)) # def vmaTimeframeHandler(self): # currentdatetime = str(self.Time) # currentdate = currentdatetime[:10] # ocurrentdate = dateutil.parser.parse(currentdate) # # printafterdate = "2018-11-18" # odate = dateutil.parser.parse(printafterdate) # # processafterdate = "2016-10-30" # oprocessdate = dateutil.parser.parse(processafterdate) # # if ocurrentdate <= oprocessdate: # return # # if ignore_date(str(self.Time), self.ignoredatelist) == True: # return # # close_price = self.Securities['GLD'].AskPrice # vma = self.ovma.determine_vma(float(close_price), self) # self.Debug(str(self.Time) + ": close_price:" + str(close_price) + " ; VMA:" + str(vma)) # if not self.Portfolio.Invested: # self.Debug(str(self.Time) + ": Portfolio Not Invested" + "; vma:" + str(vma) + " ; prev_vma:" + str(self.prev_vma)) # if vma > self.prev_vma: # self.enter = True # self.ovmagld.on_event("signalvmaenter", self) # # if self.Portfolio.Invested: # self.Debug(str(self.Time) + ": Portfolio Invested" + "; vma:" + str(vma) + " ; prev_vma:" + str(self.prev_vma)) # if vma < self.prev_vma: # self.exit = True # self.ovmagld.on_event("signalvmaexit", self) # # self.prev_vma = vma # return def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' # currentdatetime = str(self.Time) # currentdate = currentdatetime[:10] # ocurrentdate = dateutil.parser.parse(currentdate) # printafterdate = "2018-11-18" # odate = dateutil.parser.parse(printafterdate) # # processafterdate = "2016-10-30" # oprocessdate = dateutil.parser.parse(processafterdate) # # if ocurrentdate <= oprocessdate: # return # # if ignore_date(str(self.Time), self.ignoredatelist) == True: # return # # current_price = float(data["GLD"].Close) # if self.Portfolio.Invested: # if (str(self.ovmagld.state) == "completelyfilled" and # current_price > self.first_target_exit_price): # self.qty = self.position_type * ( # int(float(self.capital_per_trade) / (2.0 * float(data["GLD"].Close)))) # orderticket = self.MarketOrder("GLD", -self.qty) # self.first_pullback_entry_price = self.enter_price * \ # (1 + (self.position_type * # self.per_first_pullback_target)) # self.Debug(str(data["GLD"].Time) + ":" + "Partial exit at :" + str(current_price) + # "First Pullback: " + str(self.first_pullback_entry_price)) # # self.ovmagld.on_event("firsttargetmet", self) # # if (str(self.ovmagld.state) == "partiallyfilled1" and # current_price < self.first_pullback_entry_price): # self.qty = self.position_type * ( # int(float(self.capital_per_trade) / (2.0 * float(data["GLD"].Close)))) # orderticket = self.MarketOrder("GLD", -self.qty) # self.Debug(str(data["GLD"].Time) + ":" + "Partial entry at :" + str(current_price) + # ": qty: " + str(self.qty)) # self.first_target_exit_price = self.enter_price * \ # (1 + ( # self.position_type * self.per_first_profit_target)) # # # self.ovmagld.on_event("temppullback", self) # # # # if self.enter == True: # # self.SetHoldings(self.symbol, 0.5) # self.qty = self.position_type * (int(float(self.capital_per_trade) / float(data["GLD"].Close))) # orderticket = self.MarketOrder("GLD", self.qty) # self.enter_price = float(data["GLD"].Close) # self.sl_exit_price = self.enter_price * (1 - (self.position_type * self.per_stop_loss)) # self.target_exit_price = self.enter_price * (1 + (self.position_type * self.per_profit_target)) # self.first_target_exit_price = self.enter_price * \ # (1 + (self.position_type * self.per_first_profit_target)) # self.enter = False # self.Debug(str(data["GLD"].Time) + ":" + "Entering at :" + str(self.enter_price) + # " Target: " + str(self.target_exit_price) + " SL : " + str(self.sl_exit_price) # + "First Target: " + str(self.first_target_exit_price)) # # # # if (self.exit == True): # self.Liquidate(self.symbol) # self.exit_price = float(data["GLD"].Close) # self.Debug(str(data["GLD"].Time) + ":" + " Exiting at :" + str(self.exit_price) + # ": qty: " + str(self.qty)) # self.exit = False # self.aroon_up, self.aroon_down = self.aroon.determine_aroon(self.aroon_period, bar.High, bar.Low)