Overall Statistics |
Total Trades 89 Average Win 2.66% Average Loss -3.43% Compounding Annual Return -2.551% Drawdown 22.700% Expectancy 0.009 Net Profit -2.781% Sharpe Ratio 0.099 Probabilistic Sharpe Ratio 14.686% Loss Rate 43% Win Rate 57% Profit-Loss Ratio 0.78 Alpha -0.063 Beta 0.509 Annual Standard Deviation 0.328 Annual Variance 0.108 Information Ratio -0.476 Tracking Error 0.326 Treynor Ratio 0.064 Total Fees $0.00 |
import numpy as np from QuantConnect import * from QuantConnect.Parameters import * from QuantConnect.Benchmarks import * from QuantConnect.Brokerages import * from QuantConnect.Util import * from QuantConnect.Interfaces import * from QuantConnect.Algorithm import * from QuantConnect.Algorithm.Framework import * from QuantConnect.Algorithm.Framework.Selection import * from QuantConnect.Algorithm.Framework.Alphas import * from QuantConnect.Algorithm.Framework.Portfolio import * from QuantConnect.Algorithm.Framework.Execution import * from QuantConnect.Algorithm.Framework.Risk import * from QuantConnect.Indicators import * from QuantConnect.Data import * from QuantConnect.Data.Consolidators import * from QuantConnect.Data.Custom import * from QuantConnect.Data.Fundamental import * from QuantConnect.Data.Market import * from QuantConnect.Data.UniverseSelection import * from QuantConnect.Notifications import * from QuantConnect.Orders import * from QuantConnect.Orders.Fees import * from QuantConnect.Orders.Fills import * from QuantConnect.Orders.Slippage import * from QuantConnect.Scheduling import * from QuantConnect.Securities import * from QuantConnect.Securities.Equity import * from QuantConnect.Securities.Forex import * from QuantConnect.Securities.Interfaces import * from datetime import date, datetime, timedelta from QuantConnect.Python import * from QuantConnect.Storage import * from System import String, TimeSpan QCAlgorithmFramework = QCAlgorithm QCAlgorithmFrameworkBridge = QCAlgorithm class MagicAlgo(QCAlgorithm): def Initialize(self): #self.SetTimeZone(TimeZones.Paris) # param velocity self.velocity = 5 # param trailing stop loss self.trailingStopRisk = 0.9 # param stop loss in %. 90 = 10% self.initialStopLoss = 90 # param rsi +-% needed before triggering trades # param take profit max # param volume minimum # param risk % self.risk = 1 # Set the cash for backtest self.SetCash(10000) # Start and end dates for backtest self.SetStartDate(2020, 1, 1) self.SetEndDate(2021, 2, 1) # Add asset self.symbol = self.AddForex("CADJPY", Resolution.Hour).Symbol # Lookback length for b/o (in days) self.lookback = 20 # Upper/lower limit for lookback length self.ceiling, self.floor = 30, 10 # Price offset for stop order self.initialStopRisk = 0.98 self.limitOrder=None self.stopOrder=None self.positiveExcessRSIReached=False # Schedule function every five minutes self.Schedule.On(self.DateRules.EveryDay(self.symbol), self.TimeRules.Every(timedelta(minutes=10)), self.EveryMarketMinute) self.rsi = self.RSI(self.symbol, 14,MovingAverageType.Simple,Resolution.Hour) self.SetWarmUp(timedelta(20)) def OnData(self, data): # Plot security's price self.Plot("Data Chart", self.symbol, self.Securities[self.symbol].Close) def OnOrderEvent(self,orderEvent): self.Log(orderEvent) order = self.Transactions.GetOrderById(orderEvent.OrderId) if self.limitOrder is not None and self.stopOrder is not None and orderEvent.Status==OrderStatus.Filled and (order.Id== self.limitOrder.OrderId or order.Id==self.stopOrder.OrderId): if order.Id==self.limitOrder.OrderId: #self.Log("Stop order cancelled: %d" %self.limitOrder.OrderId) self.stopOrder.Cancel() else: #self.Log("limit order cancelled: %d" %self.stopOrder.OrderId) self.limitOrder.Cancel() def EveryMarketMinute(self): if self.rsi.IsReady: # get the current RSI value rsi_value = self.rsi.Current.Value if rsi_value > 70 and rsi_value <= 80 and (not self.History(self.symbol, 20, Resolution.Minute).empty) and (not self.positiveExcessRSIReached): lastClosesMinuteBars = self.History(self.symbol, 20, Resolution.Minute)["close"] price=self.Securities[self.symbol].Price # self.Log(previousHigh) if len(lastClosesMinuteBars) == 20: if len(self.History(self.symbol,2,Resolution.Hour))==2: previousHourHigh=self.History(self.symbol,2,Resolution.Hour)["high"][0] priceFiveMinutesAgo=lastClosesMinuteBars[15] #self.Log("DIFFERENCE: %f" % (currentHigh-previousHigh, ) ) #self.Log("Velocity %f" %((priceFiveMinutesAgo-price)*100,)) #self.Log("Price %f" %(price ,)) #self.Log("Previous %f" %(previousHourHigh,)) if (price > previousHourHigh) and ((priceFiveMinutesAgo-price)*100>self.velocity): #if ((priceFiveMinutesAgo-price)*100>self.velocity): if not self.Transactions.GetOpenOrders(self.symbol): #self.SetHoldings(self.symbol, self.risk) self.marketOrder=self.MarketOrder( self.symbol,-50000) self.limitOrder=self.LimitOrder(self.symbol,50000,price-0.20) self.stopOrder=self.StopMarketOrder(self.symbol,50000,price+0.10) self.positiveExcessRSIReached=True #self.Log("PRICE %f" %(self.Securities[self.symbol].Price,)) #self.Log("RSI %f" %(self.rsi.Current.Value,)) #self.Log("DATE: " +self.Securities[self.symbol].LocalTime.strftime("%d/%m/%Y, %H:%M:%S")) #self.Log("Limit price: %f" %(currentHigh-0.50,)) #self.Log("Quantity : %f"%(self.Portfolio[self.symbol].Quantity,)) else: while (self.stopOrder.AverageFillPrice-price)*100>=20: self.stopOrder.UpdateStopPrice(self.stopOrder.UpdateStopPrice(self.stopOrder.AverageFillPrice-0.10)) #if self.Transactions.GetOpenOrders(self.symbol): # Update the stop price #updateFields = UpdateOrderFields() #updateFields.StopPrice = self.Securities[self.symbol].Close * self.trailingStopRisk # self.stopMarketTicket.Update(updateFields) elif rsi_value<70: self.positiveExcessRSIReached=False # elif rsi_value<30: self.Plot("Data Chart", "RSI", self.rsi.Current.Value)
# Your New Python File