Overall Statistics
Total Trades
2344
Average Win
0.56%
Average Loss
-0.34%
Compounding Annual Return
-99.996%
Drawdown
59.300%
Expectancy
-0.228
Net Profit
-58.501%
Sharpe Ratio
-10.493
Loss Rate
71%
Win Rate
29%
Profit-Loss Ratio
1.67
Alpha
-11.725
Beta
240.562
Annual Standard Deviation
0.742
Annual Variance
0.551
Information Ratio
-10.516
Tracking Error
0.742
Treynor Ratio
-0.032
Total Fees
$0.00
### <summary>
### Simple RSI Strategy intended to provide a minimal algorithm example using
### one indicator
### </summary>
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Indicators")
AddReference("QuantConnect.Common")
import time
import matplotlib.pyplot as plt
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
from datetime import datetime
from System import *
from QuantConnect import *
from QuantConnect.Data.Consolidators import *
from QuantConnect.Data.Market import *
from QuantConnect.Orders import OrderStatus
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Indicators import *
import numpy as np
from datetime import timedelta, datetime
import pandas 
import numpy as np 
### <summary>
### Simple RSI Strategy intended to provide a minimal algorithm example using
### one indicator
### </summary>
class MultipleSymbolConsolidationAlgorithm(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.'''
        
      
        # Set our main strategy parameters
        self.SetStartDate(2015, 1, 1)
        self.SetEndDate(2015, 2, 1)      # Set End Date
        self.SetCash(10000)    
        self.quant = 10000
        
        self.spread = 15/10000
        self.spread_15 = 15/10000
        self.first_stg_up = 0
        self.first_stg_down = 0
        
        self.pip_s = 5
        #self.spread = 2
        
        self.tp = 33/10000
        self.sl = 14/10000
        
        self.tp_s = {} 
        self.sl_s = {} 
        
        self.tp_s_n = 0 
        self.sl_s_n = 0
        
        self.long = {} 
        self.short = {}
        self.price = {} 
        self.trade_ind = {}
        self.first_stg_up = {} 
        self.first_stg_down = {}
        
        
        
        
        BarPeriod = TimeSpan.FromHours(20)
        SimpleMovingAveragePeriod = 10
        RollingWindowSize = 20
       
       
       
        self.Data = {}
        self.trades = {}
        self.c = 0 
        # Contains all of our forex symbols
        ForexSymbols =["EURUSD", "GBPUSD", "USDCHF", "AUDUSD","NZDUSD"]
        Console.Write("init")
        
        self.fast = {}
        self.slow = {}
        self.bb_ind = {}
        
        
        
        for symbol in ForexSymbols:
            forex = self.AddForex(symbol)
            self.Data[symbol] = SymbolData(forex.Symbol, BarPeriod, RollingWindowSize)
            self.trades[symbol] = 0
           # self.Data[symbol] = 0
            self.price[symbol] = 0
            self.short[symbol] = 0
            self.long[symbol] = 0
            self.sl_s[symbol] = 0
            self.tp_s[symbol] = 0
            self.trade_ind[symbol] = 0
            self.first_stg_up[symbol] = 0 
            self.first_stg_down[symbol] = 0
            self.bb_ind[symbol] = self.BB(symbol, 20, 1, MovingAverageType.Simple, Resolution.Hour);
            self.slow[symbol] = self.SMA(symbol, 1, Resolution.Hour)
            self.fast[symbol] = self.SMA(symbol, 1, Resolution.Hour)
     
        for symbol, symbolData in self.Data.items():
            # define the indicator
            symbolData.SMA = SimpleMovingAverage(self.CreateIndicatorName(symbol, "SMA" + str(SimpleMovingAveragePeriod), Resolution.Hour), SimpleMovingAveragePeriod)
            # define a consolidator to consolidate data for this symbol on the requested period
            consolidator = TradeBarConsolidator(BarPeriod) if symbolData.Symbol.SecurityType == SecurityType.Equity else QuoteBarConsolidator(BarPeriod)
            # write up our consolidator to update the indicator
            consolidator.DataConsolidated += self.OnDataConsolidated
            # we need to add this consolidator so it gets auto updates
            self.SubscriptionManager.AddConsolidator(symbolData.Symbol, consolidator)
            
            
      
  
    def OnDataConsolidated(self, sender, bar):
        
        self.Data[bar.Symbol.Value].SMA.Update(bar.Time, bar.Close)
        self.Data[bar.Symbol.Value].Bars.Add(bar)
        
        
    def OnData(self,data):
        
        # loop through each symbol in our structure
        #Console.Write(self.c)
        for symbol in self.Data.keys():
            symbolData = self.Data[symbol]
            # this check proves that this symbol was JUST updated prior to this OnData function being called
            
            
           
            
            #trend_sma = np.where(fast.Current.Value > slow.Current.Value,1,0)
            #spread = bb_ind.UpperBand.Current.Value - bb_ind.LowerBand.Current.Value
            
            
            fxOpen = data[symbol].Open         
            fxClose = data[symbol].Close
            fxHigh = data[symbol].High
            fxLow = data[symbol].Low
            price = data[symbol].Price
            #trend = self.trend_h(symbolData)
            pip = (fxHigh - fxLow)*10000
           # bb_ind = BB(data[symbol], 20, 1, MovingAverageType.Simple, Resolution.Hour);
         #   slow = self.SMA(data[symbol], 20, Resolution.Hour)
         #   fast = self.SMA(data[symbol], 7, Resolution.Hour)
           # trend_sma = np.where(self.fast.Current.Value > self.slow.Current.Value,1,0)
            #spread = self.bb_ind.UpperBand.Current.Value - self.bb_ind.LowerBand.Current.Value
           # spread_bin = np.where(spread > self.spread,1,0)
            #Console.Write(self.slow[symbol])
            Console.Write(symbolData.SMA.Current.Value)
           # Console.Write(self.bb_ind.UpperBand.Current.Value)
            if  self.long[symbol] == 0 and self.short[symbol] == 0:
                if not self.Portfolio[symbol].Invested:
                    if  fxClose > fxOpen:# and fxClose > self.bb_ind.UpperBand.Current.Value:# and trend_sma == 1 :#  
                        self.first_stg_up[symbol] = 1 
                       # Console.Write(symbol)
                       # Console.Write("heeey stage 1 signal buy")
            
                    if self.first_stg_up[symbol] == 1:# and fxClose > self.bb_ind.LowerBand.Current.Value:# and spread_bin == 1:#
                       # Console.Write('99999')
                      #  Console.Write(symbol)
                      #  Console.Write(spread_bin)
                        self.first_stg_down[symbol] = 0
                        self.trade_ind[symbol] = 1
                
            
          
           # if  fxClose < fxOpen:# and fxClose < self.bb_ind.LowerBand.Current.Value :#trend_sma == 0 and
              #  Console.Write("eeeeeee" )
             #   self.first_stg_down[symbol] = 1
                
            
           # if self.first_stg_down[symbol] == 1  :#and fxClose <= self.bb_ind.UpperBand.Current.Value :#and spread_bin == 1
              #  Console.Write("-11111")
            #    self.first_stg_up[symbol] = 0
            #    self.trade_ind[symbol] = -1
                
        
           # if spread_bin == 0:
            #    self.first_stg_up[symbol] = 0 
             #   self.first_stg_down[symbol] = 0
           #     Console.Write("-0000000")
           #     return 0 
            #spread_bin = np.where(spread > self.spread,1,0)
            
            if not self.Portfolio[symbol].Invested:
                if pip >self.pip_s and fxOpen < fxClose and self.trade_ind[symbol] == 1 :
                       # Console.Write("trade 1 trade  " )
                        if  self.long[symbol] == 0 and self.short[symbol] == 0: 
                         #   Console.Write("trade 1 trade!!!!!!!!!!  " )
                 
                            self.price[symbol] = data[symbol].Price
                            self.tp_s[symbol] = price + self.tp
                            self.sl_s[symbol] = price - self.sl
                            self.long[symbol] = 1
                           # self.signal_h_s = 0
                            #self.signal_h_b = 0
                            self.MarketOrder(symbol, self.quant)
                         #   Console.Write("trade 1 trade !!!!!!!!! " )
                    
                    
                    
                    
                    
                    
            if self.price[symbol] > 0 and self.long[symbol] == 1 : 
                    
                    if data[symbol].Price >= self.tp_s[symbol] :
                        self.long[symbol] = 0 
                      #  Console.Write("terminer tp" )
                       # Console.Write(symbol)
                        self.Liquidate(symbol) 
                    if data[symbol].Price <= self.sl_s[symbol] :
                        self.long[symbol] = 0 
                      #  Console.Write("terminer sl" )
                      #  Console.Write(symbol)
                        self.Liquidate(symbol)
                    
                    
                    
                    
                    
                      
        
    
    def trend_h(self, data):
        
        fxClose = data.Close
        fxHigh = data.High
        fxOpen = data.Open    
      
        
        
        if trend_sma == 1 and fxClose > fxOpen and fxClose > bb_ind.UpperBand.Current.Value: 
            self.first_stg_up = 1 
            Console.Write("trend buy stage 1" )
            
        if self.first_stg_up == 1 and spread_bin == 1 and fxClose > bb_ind.LowerBand.Current.Value : 
            self.first_stg_down = 0
            Console.Write("trend buy stage 2" )
            return 1
            
            
        if trend_sma == 0 and fxClose < fxOpen and fxClose < bb_ind.LowerBand.Current.Value :
            self.first_stg_down = 1
            
        if self.first_stg_down == 1 and spread_bin == 1 and fxClose <= bb_ind.UpperBand.Current.Value :
            self.first_stg_up = 0
            return -1
            Console.Write(self.trend_n)
        
        if spread_bin == 0:
            self.first_stg_up = 0 
            self.first_stg_down = 0
            return 0   
        
       
class SymbolData(object):
    
    def __init__(self, symbol, barPeriod, windowSize):
        self.Symbol = symbol
        # The period used when population the Bars rolling window
        self.BarPeriod = barPeriod
        # A rolling window of data, data needs to be pumped into Bars by using Bars.Update( tradeBar ) and can be accessed like:
        # mySymbolData.Bars[0] - most first recent piece of data
        # mySymbolData.Bars[5] - the sixth most recent piece of data (zero based indexing)
        self.Bars = RollingWindow[IBaseDataBar](windowSize)
        # The simple moving average indicator for our symbol    
    
    def IsReady(self):
        return self.Bars.IsReady and self.SMA.IsReady

    # Returns true if the most recent trade bar time matches the current time minus the bar's period, this
    # indicates that update was just called on this instance
    def WasJustUpdated(self, current):
        return self.Bars.Count > 0 and self.Bars[0].Time == current - self.BarPeriod