| Overall Statistics |
|
Total Trades 1243 Average Win 0.01% Average Loss 0.00% Compounding Annual Return -1.635% Drawdown 2.000% Expectancy -0.654 Net Profit -1.880% Sharpe Ratio -2.723 Probabilistic Sharpe Ratio 0.000% Loss Rate 88% Win Rate 12% Profit-Loss Ratio 1.82 Alpha -0.011 Beta -0.002 Annual Standard Deviation 0.004 Annual Variance 0 Information Ratio -0.549 Tracking Error 0.133 Treynor Ratio 6.939 Total Fees $0.00 |
class ForexMinuteTrading(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2018, 10, 1)
self.SetCash(10000)
self.symbol = "EURUSD"
self.resolution = Resolution.Minute
# Order Variables
self.buyOrder = None
self.stopProfit = None
self.stopLoss = None
self.buyOrderPrice = 0
self.stopProfitPrice = 0
self.stopLossPrice = 0
# Indicators
self.AddForex(self.symbol, self.resolution, Market.FXCM)
self.slow = self.EMA(self.symbol, 20, self.resolution)
self.fast = self.EMA(self.symbol, 5, self.resolution)
self.atr = self.ATR(self.symbol, 20, MovingAverageType.Exponential, self.resolution)
self.SetWarmUp(100)
def isReady(self):
# Indicators are still warming up
if self.IsWarmingUp: return False
# Do not continue until our indicators are ready
if not self.slow.IsReady or not self.fast.IsReady or not self.atr.IsReady: return False
return True
def OnData(self, data):
if not self.isReady(): return
holdings = self.Portfolio[self.symbol].Quantity
##########
# BUYING #
##########
if holdings <= 0:
# No existing buy order
if self.buyOrder == None:
if self.fast.Current.Value > self.slow.Current.Value * 1.0001:
# Buy Order
self.buyOrder = self.LimitOrder(self.symbol, 1000, self.Securities[self.symbol].Price)
###########
# SELLING #
###########
if holdings > 0:
# We have holdings. If stop orders have not been placed and the fast EMA is higher than the slow EMA, place new stop orders.
if self.stopProfit == None and self.stopLoss == None:
if self.fast.Current.Value < self.slow.Current.Value:
self.stopProfitPrice = self.buyOrderPrice * (1 + self.atr.Current.Value)
self.stopProfit = self.LimitOrder(self.symbol, -1*self.Portfolio[self.symbol].Quantity, self.stopProfitPrice)
self.stopLossPrice = self.buyOrderPrice * (1 - (2 * self.atr.Current.Value))
self.stopLoss = self.LimitOrder(self.symbol, -1*self.Portfolio[self.symbol].Quantity, self.stopLossPrice)
# We have holdings. If stop orders have already been placed but not fulfilled, create the stop orders tighter by 1 PIP.
elif False: # or self.stopProfit != None and self.stopLoss != None:
if self.stopProfit.Status != OrderStatus.Filled and self.stopLoss.Status != OrderStatus.Filled:
# Update Stop Profit
updateStopProfitSettings = UpdateOrderFields()
self.stopProfitPrice = self.stopProfitPrice * .9999
updateStopProfitSettings.LimitPrice = self.stopProfitPrice
responseProfit = self.stopProfit.Update(updateStopProfitSettings)
# if responseProfit.IsSuccess:
# self.Debug("UPDATE: Stop Profit Limit Order" )
# Update Stop Loss
updateStopLossSettings = UpdateOrderFields()
self.stopLossPrice = self.stopLossPrice * 1.0001
updateStopLossSettings.LimitPrice = self.stopLossPrice
responseLoss = self.stopLoss.Update(updateStopLossSettings)
# if responseLoss.IsSuccess:
# self.Debug("UPDATE: Stop Loss Limit Order" )
def OnOrderEvent(self, OrderEvent):
if self.buyOrder != None:
# Buy Order has been fulfilled
if OrderEvent.OrderId == self.buyOrder.OrderId and OrderEvent.Status == OrderStatus.Filled:
self.Debug("BUY >> " + str(OrderEvent.FillPrice))
self.buyOrderPrice = OrderEvent.FillPrice
self.buyOrder = None
if self.stopProfit != None:
# Stop Profit has been fulfilled. Cancel the Stop Loss order.
if OrderEvent.OrderId == self.stopProfit.OrderId and OrderEvent.Status == OrderStatus.Filled:
self.Debug("SELL (PROFIT) >> " + str(OrderEvent.FillPrice))
self.stopLoss.Cancel()
self.stopProfit = None
self.stopLoss = None
if self.stopLoss != None:
# Stop Loss has been fulfilled. Cancel the Stop Profit order.
if OrderEvent.OrderId == self.stopLoss.OrderId and OrderEvent.Status == OrderStatus.Filled:
self.Debug("SELL (LOSS) >> " + str(OrderEvent.FillPrice))
self.stopProfit.Cancel()
self.stopProfit = None
self.stopLoss = Nonefrom QuantConnect import *
from Selection.ManualUniverseSelectionModel import ManualUniverseSelectionModel
class G10CurrencySelectionModel(ManualUniverseSelectionModel):
def __init__(self):
super().__init__([Symbol.Create(x, SecurityType.Forex, Market.Oanda) for x in [ "EURUSD", "GBPUSD", "USDJPY", "AUDUSD", "NZDUSD","USDCAD", "USDCHF", "USDNOK", "USDSEK"]])