Overall Statistics
Total Trades
152
Average Win
1.12%
Average Loss
-0.82%
Compounding Annual Return
267.335%
Drawdown
14.900%
Expectancy
0.431
Net Profit
29.695%
Sharpe Ratio
3.085
Loss Rate
39%
Win Rate
61%
Profit-Loss Ratio
1.36
Alpha
3.353
Beta
-144.037
Annual Standard Deviation
0.352
Annual Variance
0.124
Information Ratio
3.039
Tracking Error
0.352
Treynor Ratio
-0.008
Total Fees
$0.00
import decimal
import pandas as pd
from datetime import datetime, timedelta

class FXMomentumAlgorithm(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2019, 1, 7)
        self.SetEndDate(2019, 3, 20)
        self.SetCash(100000) 
        # create a dictionary to store momentum indicators for all symbols 
        self.data = {}
        self.period = 7
        slowperiod = 60
        self.symbol2 = ["NZDJPY"] #need to add EURAUD buy and AUDCHF sell...
        self.symbols = ["GBPJPY"]
        self.symbol3 = ["EURJPY"] #for nzdchf pair remember to do psar < bolband < price and viceversa
                        #"NZDJPY", "GBPJPY", "EURJPY". keeping my eye on   ranked in order of sharpe ratio.
        # warm up the MOM indicator
        self.SetWarmUp(slowperiod)
        for symbol in self.symbols:
            self.AddForex(symbol, Resolution.Minute, Market.Oanda)
            #self.atr = self.ATR(symbol, period, Resolution.Hour) 
            self.psar = self.PSAR(symbol, 0.017, 0.005, 0.2, Resolution.Hour) #lowering the start value has raised my win% and lowered my trade count., don't change the start value any lower than 0.013
            #best values for nzdchf so far are psar 0.015-7 , 0.015, 0.2 and BB 20, 1.75
            #best values for shorting are 0.01, 0.01, 0.2 for psar and 20, 2, for bolb
            self.Bolband = self.BB(symbol, 20, 2, MovingAverageType.Simple, Resolution.Hour) #initial values 13,2 raising this has raised my profit/loss :D
            self.chfSpr = False
            if self.Securities[symbol].AskPrice - self.Securities[symbol].BidPrice <= 0.05:
                self.chfSpr = True
        for symbols2 in self.symbol2:
            self.AddForex(symbols2, Resolution.Minute, Market.Oanda)
            #self.atr2 = self.ATR(symbol, period, Resolution.Hour) #first i need to practice shorting in down markets cause its COMING!!
            self.psar2 = self.PSAR(symbols2, 0.01, 0.015, 0.2, Resolution.Hour)  #initial values 0.015 and 0.005,try lowering these one at a time i guess. 
            self.Bolband2 = self.BB(symbols2, 20, 2, MovingAverageType.Simple, Resolution.Hour) #initial values 13,2 raising this has raised my profit/loss :D, lowering the 2 to 1.60 has gotten me into more trades
            self.jpySpr = False
            if self.Securities[symbols2].AskPrice - self.Securities[symbols2].BidPrice <= 0.05:
                self.jpySpr = True
        for symbols3 in self.symbol3:
            self.AddForex(symbols3, Resolution.Minute, Market.Oanda)
            #self.atr = self.ATR(symbol, period, Resolution.Hour) 
            self.psar3 = self.PSAR(symbols3, 0.006, 0.02, 0.2, Resolution.Hour) #lowering the start value has raised my win% and lowered my trade count., don't change the start value any lower than 0.013
            #best values for nzdchf so far are psar 0.015-7 , 0.015, 0.2 and BB 20, 1.75
            #best values for shorting are 0.01, 0.01, 0.2 for psar and 20, 2, for bolb
            self.Bolband3 = self.BB(symbols3, 20, 2, MovingAverageType.Simple, Resolution.Hour) #initial values 13,2 raising this has raised my profit/loss :D
            self.eurSpr = False
            if self.Securities[symbols3].AskPrice - self.Securities[symbols3].BidPrice <= 0.05:
                self.eurSpr = True
    def OnData(self, data):
        for symbol in self.symbols:
            if not self.psar.IsReady: 
                return
        for symbols2 in self.symbol2:
            if not self.psar2.IsReady: 
                return    
        for symbols3 in self.symbol3:
            if not self.psar3.IsReady: 
                return  
        if self.IsWarmingUp: return
 
        holdings = self.Portfolio[symbol].Quantity
        holdings2 = self.Portfolio[symbols2].Quantity 
        
        for symbol in self.symbols:
            #self.Log("holdings are : " + str(holdings)) 
            if not self.Portfolio[symbol].IsLong and self.chfSpr:
                if self.psar.Current.Value <= self.Bolband.MiddleBand.Current.Value <= self.Securities[symbol].Price:
                    #self.Log("holdings should be 0: " + str(holdings) + " and invested should be False:" + str(self.Portfolio[symbol].Invested))
                    self.SetHoldings(symbol, 2.5)
                    self.Log("Settled Cash: " + str(self.Portfolio.Cash)) 
                    #self.Log("Market Order " + str(self.Securities[symbol].Price) + " for " + str(self.Securities[symbol]))
            elif self.Portfolio[symbol].IsLong and self.chfSpr:     
                if self.psar.Current.Value >= self.Bolband.UpperBand.Current.Value >= self.Securities[symbol].Price:
                    #self.Log("holdings should be below 0: " + str(holdings)  + " and invested should be True:" + str(self.Portfolio[symbol].Invested))
                    #self.MarketOrder(symbol, 150000)
                    self.Liquidate()
                    self.Log("Settled Cash: " + str(self.Portfolio.Cash)) 
                    #self.Log("PSAR below price, buying " + str(self.Securities[symbol].Price) + " for " + str(self.Securities[symbol]))
        for symbols2 in self.symbol2:
            #self.Log("holdings are : " + str(holdings2))
            if not self.Portfolio[symbols2].IsLong and self.jpySpr:
                if self.psar2.Current.Value <= self.Securities[symbols2].Price <= self.Bolband2.MiddleBand.Current.Value:
                    #self.Log("holdings should be 0: " + str(holdings2) + " and invested should be False:" + str(self.Portfolio[symbols2].Invested))
                    self.SetHoldings(symbols2, 2.5)
                    self.Log("Settled Cash: " + str(self.Portfolio.Cash)) 
                    #self.Log("Market Order " + str(self.Securities[symbols2].Price) + " for " + str(self.Securities[symbols2]))
            elif self.Portfolio[symbols2].IsLong and self.jpySpr:     
                self.Log("not short, checking for shorting condition")
                if self.psar2.Current.Value >= self.Securities[symbols2].Price >= self.Bolband2.UpperBand.Current.Value:
                    #self.Log("holdings should be below 0: " + str(holdings2)  + " and invested should be True:" + str(self.Portfolio[symbols2].Invested))
                    #self.MarketOrder(symbols2, -150000)
                    self.Liquidate()
                    self.Log("Settled Cash: " + str(self.Portfolio.Cash))
                    #self.Log("PSAR below price, buying " + str(self.Securities[symbols2].Price) + " for " + str(self.Securities[symbols2]))
        for symbols3 in self.symbol3:
            #self.Log("holdings are : " + str(holdings2))
            if not self.Portfolio[symbols3].IsLong and self.eurSpr:
                if self.psar3.Current.Value <= self.Securities[symbols3].Price <= self.Bolband3.MiddleBand.Current.Value:
                    #self.Log("holdings should be 0: " + str(holdings2) + " and invested should be False:" + str(self.Portfolio[symbols2].Invested))
                    self.SetHoldings(symbols3, 2.5)
                    self.Log("Settled Cash: " + str(self.Portfolio.Cash)) 
                    #self.Log("Market Order " + str(self.Securities[symbols2].Price) + " for " + str(self.Securities[symbols2]))
            elif self.Portfolio[symbols3].IsLong and self.eurSpr:     
                self.Log("not short, checking for shorting condition")
                if self.psar3.Current.Value >= self.Securities[symbols3].Price >= self.Bolband3.UpperBand.Current.Value:
                    #self.Log("holdings should be below 0: " + str(holdings2)  + " and invested should be True:" + str(self.Portfolio[symbols2].Invested))
                    #self.MarketOrder(symbols2, -150000)
                    self.Liquidate()
                    self.Log("Settled Cash: " + str(self.Portfolio.Cash))
                    #self.Log("PSAR below price, buying " + str(self.Securities[symbols2].Price) + " for " + str(self.Securities[symbols2]))