Overall Statistics
Total Trades
2
Average Win
0%
Average Loss
-0.01%
Compounding Annual Return
-0.029%
Drawdown
0.000%
Expectancy
-1
Net Profit
-0.014%
Sharpe Ratio
-1.414
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.001
Beta
0.012
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-25.673
Tracking Error
0.001
Treynor Ratio
-0.024
Total Fees
$2.00
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Common")

from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Data import SubscriptionDataSource
from QuantConnect.Python import PythonData
import datetime
from System.Collections.Generic import List
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Data.UniverseSelection import *
import decimal as d
import numpy as np
import math
import json

class DropboxBaseDataUniverseSelectionAlgorithm(QCAlgorithm):

    def Initialize(self):
        
        self.SetCash(10000.00)
        self._changes = None
        self.UniverseSettings.Resolution = Resolution.Minute;

        
        #self.SetStartDate(2018,1,1)
        #self.SetEndDate(2018,3,31)
        
        start_date_str = '2018-01-04'
        end_date_str = '2018-01-04'
        
        start_datetime = datetime.datetime.strptime(start_date_str,'%Y-%m-%d')
        end_datetime = datetime.datetime.strptime(end_date_str,'%Y-%m-%d')
        window_size = 90
        
        start_datetime = start_datetime - datetime.timedelta(days=window_size*2+1)
        self.SetStartDate(start_datetime)
        self.SetEndDate(end_datetime)
        
        self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash)
        
        self.AddUniverse(StockDataSource, "my-stock-data-source", self.stockDataSource)
        
        # Add SPY just to get access to the AfterMarketOpen and BeforeMarketClose calls.
        self._spy = self.AddEquity("SPY", Resolution.Minute)
        self._blacklist = [self._spy]
        
        self.Schedule.On(self.DateRules.EveryDay("SPY"), 
            self.TimeRules.AfterMarketOpen("SPY",1),
            Action(self.on_market_opened))
        self.Schedule.On(self.DateRules.EveryDay("SPY"), 
            self.TimeRules.BeforeMarketClose("SPY",16),
            Action(self.on_before_market_closes))
        
    def stockDataSource(self, data):
        list = []
        for item in data:
            for symbol in item["Symbols"]:
                list.append(symbol)
        return list

    def OnData(self, slice):
        
        #for key in slice.Keys:
        #    self.Log('{} Data for symbol: {}'.format(str(self.Time), key))

        if slice.Bars.Count == 0: return
        if self._changes == None: return
        
        # start fresh
        #self.Liquidate()

        #percentage = 1 / d.Decimal(slice.Bars.Count)
        #for tradeBar in slice.Bars.Values:
        #    self.SetHoldings(tradeBar.Symbol, percentage)
        
        # reset changes
        self._changes = None
    
    def OnSecuritiesChanged(self, changes):
        self._changes = changes
        self.Debug('{} Universe Changes: {}'.format(str(self.Time), changes))
        
    def on_market_opened(self):
        #self.Debug('{} on_market_open'.format(str(self.Time)))
        if self._changes == None: 
            return
        
        for security in self._changes.AddedSecurities:
            if self.trading_criteria_met(security):
                self.SetHoldings(security.Symbol, 0.01)
                
    def trading_criteria_met(self, security):
        if 'CMC' not in security.Symbol.Value:
            return False
        
        if security.Invested:
            return False
        
        if security in self._blacklist:
            return False
            
        if not self.criteria3(security):
            return False
        
        return True
        
    def criteria3(self, security):

        self.Debug('security.Symbol: {}'.format(security.Symbol))
        self.Debug('security.Open: {}'.format(security.Open))
        
        # Create list of symbols to load history.
        # The symbols can be one or multiple, one in this case
        syms = []
        syms.append(security.Symbol)
        #for sec in self._changes.AddedSecurities:
        #    syms.append(sec.Symbol)
        
        # Get a multi index dataframe
        history_df = self.History( syms , 90, Resolution.Daily)
        self.Debug('{}'.format(history_df))
        
        # Select the security close and get a single index dataframe
        # Must reference by str(security.Symbol)
        sym = str(security.Symbol) 
        self.Debug('sym to get: {}'.format(sym))
        #sym_df = history_df.loc[sym]  # optional, select everything for one symbol
        close_df = history_df.loc[sym]['close'] # select date & closing prices for one sym
        self.Debug('{}'.format(close_df))

        return True
                    
    def on_before_market_closes(self):
        for holding in self.Portfolio.Values:
            if holding.HoldStock:
                #self.SetHoldings(s,0.0, tag="ScheduledEvent EOD Liquidate")
                self.MarketOnCloseOrder(holding.Symbol, -holding.Quantity)

    def OnOrderEvent(self, orderEvent):
        self.Log(str(orderEvent))
                
class StockDataSource(PythonData):
    
    def GetSource(self, config, date, isLiveMode):
        if isLiveMode:
            url = None
        else:
            url = "https://www.dropbox.com/s/e5jyy6w5rsk03cf/e0007f.csv?dl=1"
            
        return SubscriptionDataSource(url, SubscriptionTransportMedium.RemoteFile)
    
    def Reader(self, config, line, date, isLiveMode):
        if not (line.strip() and line[0].isdigit()): return None
        
        stocks = StockDataSource()
        stocks.Symbol = config.Symbol
        
        csv = line.split(',')
        if isLiveMode:
            stocks.Time = date
            stocks["Symbols"] = csv
        else:
            stocks.Time = datetime.datetime.strptime(csv[0], "%Y-%m-%d")
            stocks["Symbols"] = csv[1:]
        return stocks