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