| Overall Statistics |
|
Total Trades 1356 Average Win 0.04% Average Loss -0.05% Compounding Annual Return -14.626% Drawdown 8.000% Expectancy -0.334 Net Profit -7.687% Sharpe Ratio -4.878 Probabilistic Sharpe Ratio 0.000% Loss Rate 62% Win Rate 38% Profit-Loss Ratio 0.77 Alpha -0.116 Beta -0.01 Annual Standard Deviation 0.025 Annual Variance 0.001 Information Ratio -2.625 Tracking Error 0.193 Treynor Ratio 11.643 Total Fees $0.00 |
from datetime import timedelta
import QuantConnect
from QuantConnect import Resolution
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Orders import OrderStatus
from QuantConnect import Chart, SeriesType
from QuantConnect import Series
class MultidimensionalTransdimensionalCoreWave(QCAlgorithm):
__risk = 0.2
__pair = "EURUSD"
__takeProfit = None
__stopLoss = None
__ema = None
__lastTrade = "short"
def Initialize(self):
self.SetStartDate(2020, 4, 19) # Set Start Date
self.SetCash(1000) # Set Strategy Cash
self.AddForex(self.__pair, Resolution.Hour) # The pair we trade
self.__ema = self.EMA(self.__pair, 20, Resolution.Hour) # The exponential moving average we use
chart = Chart("Chart")
candles = Series("Candles", SeriesType.Candle)
ema = Series("EMA", SeriesType.Line)
buy = Series("Buy", SeriesType.Scatter)
sell = Series("Sell", SeriesType.Scatter)
chart.AddSeries(candles)
chart.AddSeries(ema)
chart.AddSeries(buy)
chart.AddSeries(sell)
self.AddChart(chart)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
# Wait till ema is initialized
if not self.__ema.IsReady: return
pairBar = data[self.__pair]
self.Plot("Chart", "Candles", pairBar.Close)
self.Plot("Chart", "EMA", self.__ema.Current.Value)
if pairBar.Close > self.__ema.Current.Value and self.__lastTrade is not "long":
self.Liquidate(self.__pair)
self.SetHoldings(self.__pair, self.__risk, True)
holdings = self.Portfolio[self.__pair].Quantity
self.__takeProfit = self.LimitOrder(self.__pair, -holdings, pairBar.Close + 0.00050)
self.__stopLoss = self.StopMarketOrder(self.__pair, -holdings, pairBar.Close - 0.00020)
self.__lastTrade = "long"
self.Plot("Chart","Buy", pairBar.Close)
self.Log("Long : " + str(pairBar.Close) + " " + str(self.__ema.Current.Value))
if pairBar.Close < self.__ema.Current.Value and self.__lastTrade is not "short":
self.Liquidate(self.__pair)
self.SetHoldings(self.__pair, -self.__risk, True)
holdings = self.Portfolio[self.__pair].Quantity
self.__stopLoss = self.LimitOrder(self.__pair, holdings, pairBar.Close + 0.00020)
self.__takeProfit = self.StopMarketOrder(self.__pair, holdings, pairBar.Close - 0.00050)
self.__lastTrade = "short"
self.Plot("Chart", "Sell", pairBar.Close)
self.Log("Short : " + str(pairBar.Close) + " " + str(self.__ema.Current.Value))
def OnOrderEvent(self, orderEvent: QuantConnect.Orders.OrderEvent) -> None:
super().OnOrderEvent(orderEvent)
if orderEvent is None: return
if orderEvent.Status is OrderStatus.Canceled: return
if self.__stopLoss is None or self.__takeProfit is None: return
self.Log("Order event " + str(orderEvent.OrderId) + " incoming")
# Cancel stops loss and take profits if one of them was triggered
if self.__stopLoss.OrderId is orderEvent.OrderId:
self.__takeProfit.Cancel()
self.Log("Take Profit " + str(self.__takeProfit.OrderId) + " was canceled")
if self.__takeProfit.OrderId is orderEvent.OrderId:
self.__stopLoss.Cancel()
self.Log("Stop loss " + str(self.__stopLoss.OrderId) + " was canceled")