Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-10.984
Tracking Error
0.043
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
from System.Drawing import Color


class MyFirstAlgo(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2021, 4, 1)
        self.SetEndDate(2021, 4, 10)
        self.SetCash(100000)

        self.stopLossPercent = .02
        self.profitTargetPercent = .03
        self.orderTicket = None
        self.profitTicket = None
        self.stopLossTicket = None

        self.symbol = "EURUSD"
        self.AddForex(self.symbol, Resolution.Minute, Market.FXCM)
        self.lotSize = self.Securities[self.symbol].SymbolProperties.LotSize
        self._trend = 0
        self.Consolidate(self.symbol, timedelta(minutes=30), self.ThirtyMinuteBarHandler)

        self.benchmarkTicker = self.symbol
        self.SetBenchmark(self.benchmarkTicker)
        self.initBenchmarkPrice = None

        self.SetBrokerageModel(BrokerageName.FxcmBrokerage)

        self.macd = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.Exponential)
        self.RegisterIndicator(self.symbol, self.macd, timedelta(minutes=30))

        self.ema_slow = self.LWMA(self.symbol, 100, Resolution.Hour)
        self.ema_fast = self.EMA(self.symbol, 50, Resolution.Hour)

        self.SetWarmUp(210, Resolution.Hour)

        self.initPlots()

    def ThirtyMinuteBarHandler(self, bar):
        if self.IsWarmingUp:
            return

        if self.Time.hour % 13 == 0:
            self.plot()

        if self.Portfolio[self.symbol].Invested:
            return

        self.trend(bar)
        self.Debug(self._trend)
        currentPrice = round(bar.Close, 5)
        sellPrice = round(bar.Ask.Close, 5)
        buyPrice = round(bar.Bid.Close, 5)
        self.Debug(currentPrice)
        self.Debug(buyPrice)
        self.Debug(sellPrice)
        quantity = self.CalculateOrderQuantity(self.symbol, 1)
        self.Debug(quantity)
        if self._trend == 1:
            if self.orderTicket is not None and self.orderTicket.Status in [OrderStatus.Submitted, OrderStatus.UpdateSubmitted]:
                self.Debug("Updating Long")
                updateSettings = UpdateOrderFields()
                updateSettings.LimitPrice = buyPrice
                self.orderTicket.Update(updateSettings)
            elif self.macd.Current.Value > self.macd.Signal.Current.Value and self.macd.Signal.Current.Value > 0:
                self.Debug("New Long")
                self.orderTicket = self.LimitOrder(self.symbol, quantity, buyPrice, "Long")
        elif self._trend == -1:
            if self.orderTicket is not None and self.orderTicket.Status in [OrderStatus.Submitted, OrderStatus.UpdateSubmitted]:
                self.Debug("Updating Short")
                updateSettings = UpdateOrderFields()
                updateSettings.LimitPrice = sellPrice
                self.orderTicket.Update(updateSettings)
            elif self.macd.Current.Value < self.macd.Signal.Current.Value and self.macd.Signal.Current.Value < 0:
                self.Debug("New Short")
                self.orderTicket = self.LimitOrder(self.symbol, -quantity, sellPrice, "Short")
            else:
                self.Debug("No Trend")

    def OnOrderEvent(self, orderEvent):
        order = self.Transactions.GetOrderById(orderEvent.OrderId)
        status = {0: "New", 1:"Submitted", 2:"PartiallyFilled", 3:"Filled", 4:"Canceled", 5:"None", 6:"Invalid", 7:"CancelPending", 8:"UpdateSubmitted"}
        self.Debug(f">{order.Tag}: {status.get(orderEvent.Status)}")
        self.Debug(f"Open Orders: {len(self.Transactions.GetOpenOrders())}")
        # self.Debug(f"Open Orders: {len(self.Transactions.GetOpenOrders())}")

        if self.orderTicket is not None and self.orderTicket.OrderId == orderEvent.OrderId and self.orderTicket.Status == OrderStatus.Filled:
            qty = -self.orderTicket.QuantityFilled
            price = self.orderTicket.AverageFillPrice
            tag_tp = f"{self.orderTicket.Tag} TP"
            tag_sl = f"{self.orderTicket.Tag} SL"
            self.Debug(qty)
            self.Debug(price)
            self.Debug(tag_tp)
            self.Debug(tag_sl)
        if self.orderTicket.Tag == "Long":
            stopPrice = round(price * (1 - self.stopLossPercent), 5)
            targetPrice = round(price * (1 + self.profitTargetPercent), 5)
        if self.orderTicket.Tag == "Short":
            stopPrice = round(price * (1 + self.stopLossPercent), 5)
            targetPrice = round(price * (1 - self.profitTargetPercent), 5)
            self.Debug(stopPrice)
            self.Debug(targetPrice)
            self.profitTicket = self.LimitOrder(self.symbol, qty, targetPrice, tag_tp)
            self.stopLossTicket = self.StopMarketOrder(self.symbol, qty, stopPrice, tag_sl)
            self.UpdateBenchmarkValue()
            self.Plot('Strategy Equity', f"Open {self.orderTicket.Tag}", self.benchmarkValue+15)

        if self.profitTicket is not None and self.profitTicket.OrderId == orderEvent.OrderId and self.profitTicket.Status == OrderStatus.Filled:
            self.Transactions.CancelOpenOrders()
            # response = self.stopLossTicket.Cancel("TP Hit")
            # if response.IsSuccess:
                # self.Debug("TP Order Canceled")
                # self.Debug(f"Open Orders: {len(self.Transactions.GetOpenOrders())}")
            self.UpdateBenchmarkValue()
            self.Plot('Strategy Equity', f"Close {self.orderTicket.Tag}", self.benchmarkValue-15)

        if self.stopLossTicket is not None and self.stopLossTicket.OrderId == orderEvent.OrderId and self.stopLossTicket.Status == OrderStatus.Filled:
            self.Transactions.CancelOpenOrders()
            # response = self.profitTicket.Cancel("SL Hit")
            # if response.IsSuccess:
            # self.Debug("SL Order Canceled")
            # self.Debug(f"Open Orders: {len(self.Transactions.GetOpenOrders())}")
            self.UpdateBenchmarkValue()
            self.Plot('Strategy Equity', f"Close {self.orderTicket.Tag}", self.benchmarkValue-15)

    def OnData(self, data):
        pass

    def trend(self, bar):
        if all(
                [
                bar.Close < self.ema_slow.Current.Value,
                # self.Securities["EURUSD"].Price < self.ema_fast.Current.Value,
                # self.ema_slow.Current.Value > self.ema_fast.Current.Value,
                ]
                ):
            _trend = -1
        elif all(
                [
                bar.Close > self.ema_slow.Current.Value,
                # self.Securities["EURUSD"].Price > self.ema_fast.Current.Value,
                # self.ema_slow.Current.Value < self.ema_fast.Current.Value,
                ]
                ):
            _trend = 1
        else:
            _trend = 0
            self._trend = _trend

    def initPlots(self):

        trendPlot = Chart('Trend Indicator')
        trendPlot.AddSeries(Series('Price', SeriesType.Line))
        trendPlot.AddSeries(Series('EMA 200', SeriesType.Line))
        # trendPlot.AddSeries(Series('EMA 50', SeriesType.Line))
        self.AddChart(trendPlot)

        ocPlot = Chart('Open Close Indicator')
        ocPlot.AddSeries(Series('MACD', SeriesType.Line))
        ocPlot.AddSeries(Series('Signal', SeriesType.Line))
        self.AddChart(ocPlot)

        tradesPlot = Chart('Strategy Equity')
        # tradesPlot.AddSeries(Series('Price', SeriesType.Line, "$"))
        tradesPlot.AddSeries(Series('Open Long', SeriesType.Scatter, "", Color.Green, ScatterMarkerSymbol.Triangle))
        tradesPlot.AddSeries(Series('Close Long', SeriesType.Scatter, "", Color.Red, ScatterMarkerSymbol.Triangle))
        tradesPlot.AddSeries(Series('Open Short', SeriesType.Scatter, "", Color.Green, ScatterMarkerSymbol.TriangleDown))
        tradesPlot.AddSeries(Series('Close Short', SeriesType.Scatter, "", Color.Red, ScatterMarkerSymbol.TriangleDown))
        self.AddChart(tradesPlot)

    def plot(self):
        self.Plot('Trend Indicator', 'Price', self.Securities[self.symbol].Close)
        self.Plot('Trend Indicator', 'EMA 200', self.ema_slow.Current.Value)
        # self.Plot('Trend Indicator', 'EMA 50', self.ema_fast.Current.Value)
        self.Plot('Open Close Indicator', 'MACD', self.macd.Current.Value)
        self.Plot('Open Close Indicator', 'Signal', self.macd.Signal.Current.Value)

        self.UpdateBenchmarkValue()
        self.Plot('Strategy Equity', self.benchmarkTicker, self.benchmarkValue)

        # self.Plot('Trades', 'Price', self.Securities[self.symbol].Close)


    def UpdateBenchmarkValue(self):
            if self.initBenchmarkPrice is None:
                self.initBenchmarkCash = self.Portfolio.Cash
                self.initBenchmarkPrice = self.Benchmark.Evaluate(self.Time)
                self.benchmarkValue = self.initBenchmarkCash
            else:
                self.benchmarkValue = (
                    self.Benchmark.Evaluate(self.Time) / self.initBenchmarkPrice
                    ) * self.initBenchmarkCash