Overall Statistics
Total Trades
921
Average Win
1.27%
Average Loss
-0.73%
Compounding Annual Return
19.741%
Drawdown
14.900%
Expectancy
0.087
Net Profit
29.049%
Sharpe Ratio
0.794
Loss Rate
60%
Win Rate
40%
Profit-Loss Ratio
1.75
Alpha
0.184
Beta
-1.211
Annual Standard Deviation
0.208
Annual Variance
0.043
Information Ratio
0.717
Tracking Error
0.208
Treynor Ratio
-0.136
Total Fees
$1703.85
import numpy as np
import pandas as pd
import datetime

class EClass:   
    def __init__(self,e):
        self.e = e
        self.ex_count = 0 
        self.highSearch = True
        self.high = 0
        self.low = 10000
        self.pXm = [0]
        self.highs = [0 for x in range(3)]
        self.lows  = [0 for x in range(3)]

class Instrument:

    
    def __init__(self, instrumentPreferences, ticker):
        self.tradeC = 0
        self.elist = []
        for e in instrumentPreferences:
            self.elist.append(EClass(e))
        self.ticker = ticker
    
    def high_low_update(self, price):
        for e in self.elist:
            if price <= e.low:
                e.low = price
            elif price >= e.high:
                e.high = price

    
    def how_far(self,price, tick_size):
        for e in self.elist:
            if e.highSearch == True:
                if ((e.high - price)/tick_size) > e.e:
                    e.highs.insert(0,round(e.high,4))
                    e.highSearch = False
                    e.high = price
                    e.low = price
                    e.ex_count += 1
                    if (e.ex_count)>1:
                        e.pXm.insert(0,round((e.highs[0]-e.lows[0])/tick_size))
            else:
                if ((price - e.low)/tick_size) > e.e:
                    e.highSearch = True
                    e.lows.insert(0,round(e.low,4))
                    e.high = price
                    e.low = price
                    e.ex_count += 1
                    if (e.ex_count)>1:
                        e.pXm.insert(0,round((e.lows[0]-e.highs[0])/tick_size))
        return 0
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Common")

from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Securities import *
from datetime import timedelta
import pandas as pd
import numpy as np
from decimal import Decimal
import Deborah  

### <summary>
### Basic template algorithm simply initializes the date range and cash. This is a skeleton
### framework you can use for designing an algorithm.
### </summary>
class BasicTemplateAlgorithm(QCAlgorithm):
    '''Basic template algorithm simply initializes the date range and cash'''

    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.Log("Initialize")
        self.pref = ["GC", float(0.1), [60]]
        self.SetStartDate(2017,1,1)  #Set Start Date
        self.SetEndDate(2018,6,1)    #Set End Date
        self.SetCash(50000)           #Set Strategy Cash
        # Find more symbols here: http://quantconnect.com/data
        nq = self.AddFuture(self.pref[0], Resolution.Minute)
        self.Log("_________")
        nq.SetFilter(timedelta(0), timedelta(182))
        self.deborah_nq = Deborah.Instrument(self.pref[2],self.pref[0])
        self.prev_len = len(self.deborah_nq.elist[0].pXm)
  

    def OnData(self, slice):
       
        for chain in slice.FutureChains:
             # Get contracts expiring no earlier than in 90 days
            contracts = list(filter(lambda x: x.Expiry > self.Time + timedelta(90), chain.Value))
            # if there is any contract, trade the front contract
            if len(contracts) == 0: 
                continue
            front = sorted(contracts, key = lambda x: x.Expiry, reverse=True)[0]
            self.deborah_nq.high_low_update(float(front.LastPrice))
            self.deborah_nq.how_far(float(front.LastPrice),self.pref[1])
            
            if len(self.deborah_nq.elist[0].pXm) > self.prev_len:
                volume = (self.deborah_nq.elist[0].pXm[0]/abs(self.deborah_nq.elist[0].pXm[0]))*(-1)
                
                if self.Portfolio.Invested: 
                    self.Liquidate()
                self.MarketOrder(front.Symbol , int(volume))
                self.prev_len = len(self.deborah_nq.elist[0].pXm)