Overall Statistics
Total Trades
491
Average Win
0.41%
Average Loss
-0.24%
Compounding Annual Return
3.049%
Drawdown
4.700%
Expectancy
0.028
Net Profit
2.045%
Sharpe Ratio
0.364
Loss Rate
62%
Win Rate
38%
Profit-Loss Ratio
1.74
Alpha
-0.02
Beta
2.943
Annual Standard Deviation
0.074
Annual Variance
0.005
Information Ratio
0.146
Tracking Error
0.074
Treynor Ratio
0.009
Total Fees
$0.00
import clr
clr.AddReference("System")
clr.AddReference("QuantConnect.Algorithm")
clr.AddReference("QuantConnect.Indicators")
clr.AddReference("QuantConnect.Common")

from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *

class HustleForexAlgo(QCAlgorithm):
    '''In this example we look at the 13ema/20sma hourly moving average cross. This algorithm
    will go long when the 13ema crosses above the 20sma and will go short when the 13ema crosses
    back below the 20sma.'''
    
    def __init__(self):
            self.symbol = "EURUSD"
            self.previous = None
            self.fast = None
            self.slow = None
    
    def Initialize(self):
        
        self.SetStartDate(2017,6,1)  #Set Start Date
        self.SetEndDate(2018,2,1)    #Set End Date
        self.SetCash(100000)             #Set Strategy Cash
        self.AddForex("EURUSD", Resolution.Hour, Market.Oanda) #Set time frame for bars.
        
        # create a 13 period exponential moving average
        self.fast = self.EMA(self.symbol, 13);
        
        # create a 20 period simple moving average
        self.slow = self.SMA(self.symbol, 20);
        
        self.PlotIndicator("EMA", self.fast);
        self.PlotIndicator("SMA", self.slow);
        
        self.previous = None
        
    def OnData(self, data):
        
        # wait for our fast ema to fully initialize
        if not self.fast.IsReady:
            return 
        
        # wait for our slow ema to fully initialize
        if not self.slow.IsReady:
            return    
        
        # define a small tolerance on our checks to avoid bouncing
        tolerance = 0.000000;
        
        holdings = self.Portfolio[self.symbol].Quantity

        # Bullish entry from no position
        if holdings == 0:
            # if the 13ema is greater than the 20sma, we'll go long
            if self.fast.Current.Value > self.slow.Current.Value * int(1 + tolerance):
                newTicket = self.MarketOrder(self.symbol, 100000)
        
        # Bearish entry from no position
        if holdings == 0:
            # if the 13ema is lower than the 20sma, we'll go short
            if self.fast.Current.Value < self.slow.Current.Value * int(1 + tolerance):
                newTicket = self.MarketOrder(self.symbol, -100000)        

        # Bullish entry from short position
        if holdings < 0:
            # if the 13ema is greater than the 20sma, we'll go long
            if self.fast.Current.Value > self.slow.Current.Value * int(1 + tolerance):
                newTicket = self.MarketOrder(self.symbol, int(-1 * holdings))
                newTicket = self.MarketOrder(self.symbol, 100000)
             
        # Bearish entry from long position
        if holdings > 0:
            # if the 13ema is lower than the 20sma, we'll go short
            if self.fast.Current.Value < self.slow.Current.Value * int(1 + tolerance):
                newTicket = self.MarketOrder(self.symbol, int(-1 * holdings))
                newTicket = self.MarketOrder(self.symbol, -100000)
                
        self.previous = self.Time