Overall Statistics
Total Trades
200
Average Win
42.26%
Average Loss
-8.74%
Compounding Annual Return
-88.414%
Drawdown
100.000%
Expectancy
-0.324
Net Profit
-99.982%
Sharpe Ratio
0.528
Loss Rate
88%
Win Rate
12%
Profit-Loss Ratio
4.84
Alpha
-2.482
Beta
230.934
Annual Standard Deviation
2.371
Annual Variance
5.623
Information Ratio
0.522
Tracking Error
2.371
Treynor Ratio
0.005
Total Fees
$2348.32
import numpy as np
import decimal as d
import math

class BasicTemplateAlgorithm(QCAlgorithm):


    def Initialize(self):
        
        self.symbol = "EURUSD"
        
        self.SetStartDate(2013,01,01)  #Set Start Date
        self.SetEndDate(2016,12,31)    #Set End Date
        self.SetCash(100000)           #Set Strategy Cash
        
        self.SetBrokerageModel(BrokerageName.FxcmBrokerage)
        self.AddSecurity(SecurityType.Forex, self.symbol, Resolution.Hour)
        
        #Indicators in strategy
        self.atr_value = self.ATR(self.symbol, 14, MovingAverageType.Exponential, Resolution.Hour)
        
        #Candlestick patterns in strategy
        self.hammer_pattern = self.CandlestickPatterns.Hammer(self.symbol, Resolution.Hour)
        self.doji_pattern = self.CandlestickPatterns.Doji(self.symbol, Resolution.Hour)
        
        ema_slow = 20
        self.slow = self.EMA(self.symbol, ema_slow, Resolution.Hour)
        
        self.var_bb = self.BB(self.symbol, 20, 2, MovingAverageType.Exponential, Resolution.Hour)
        
        
        
        #Plotting
        self.should_i_plot = 0 #Change to 1 if you want to plot.
        
        if self.should_i_plot == 1:
            stockPlot = Chart('Trade Plot')
            # On the Trade Plotter Chart we want 3 series: trades and price:
            stockPlot.AddSeries(Series('Price', SeriesType.Candle, 0))
            self.AddChart(stockPlot)
        
        
        
        
    def OnData(self, data):
        
        #Install positions size algo depending on portfolio size
        
        #Welcome Zijian, you can do this with SetHoldings("Symbol", Fraction); this will calculate the required order size and place a market order.
        #If you want to do this manually you can use CalculateOrderQuantity(symbol, targetFraction) which will return the number of shares you need to purchase.
        
        
        
        
        #Long, Entry Condition 1, Hammer formation below bb middleband.
        if self.hammer_pattern.Current.Value > 0 and self.Securities[self.symbol].Price < self.var_bb.MiddleBand.Current.Value:
            
            posSize = self.CalculateOrderQuantity(self.symbol, 1)
            
            self.Log('Hammer below middleband, BUY  >> {0}'.format(self.Securities[self.symbol].Price))
            self.Log('Position size  >> {0}'.format(posSize))
            
            #d.getcontext().prec = 4
            stopPrice = d.Decimal(self.Securities[self.symbol].High)
            limitPrice = d.Decimal(stopPrice) + d.Decimal(0.0015)
            newTicket = self.StopLimitOrder(self.symbol, posSize, stopPrice, limitPrice)
            
            #Stoploss, Condition 1.
            #d.getcontext().prec = 4
            tradePrice = self.Securities[self.symbol].Price
            stopPrice = tradePrice - self.atr_value.Current.Value
            newTicket = self.StopMarketOrder(self.symbol, posSize*(-1), stopPrice)
            
            #Trailing Stop, Condition 1.
            #round(2.665, 2)
            #d.getcontext().prec = 5
            
            #>>> Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
            #Decimal('7.32')
            #>>> Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
            #Decimal('8')
        
        
        #Long, Entry Condition 2, doji below lowerband
        #if self.doji_pattern.Current.Value > 0 and self.Securities[self.symbol].Price < self.var_bb.LowerBand.Current.Value:
        #    self.SetHoldings(self.symbol, 1.0, True)
        #    self.Log('doji below lowerband, BUY  >> {0}'.format(self.Securities[self.symbol].Price))


        #Plot the asset price.
        if self.should_i_plot == 1:
            self.lastPrice = self.Portfolio[self.symbol].Price
            self.Plot('Asset price', 'Price', self.lastPrice)


        #if not self.Portfolio.Invested:
        #    self.SetHoldings(self.symbol, 1)