Overall Statistics |
Total Trades 83 Average Win 0.08% Average Loss -1.17% Compounding Annual Return -1.086% Drawdown 2.800% Expectancy -0.039 Net Profit -2.134% Sharpe Ratio -0.615 Loss Rate 10% Win Rate 90% Profit-Loss Ratio 0.06 Alpha 0.111 Beta -8.569 Annual Standard Deviation 0.012 Annual Variance 0 Information Ratio -1.75 Tracking Error 0.012 Treynor Ratio 0.001 Total Fees $0.00 |
import numpy as np import pandas as pd from QuantConnect.Data import SubscriptionDataSource from QuantConnect.Python import PythonData from datetime import date, timedelta, datetime from decimal import Decimal import math import calendar ### <summary> ### Basic template algorithm simply initializes the date range and cash. This is a skeleton ### framework you can use for designing an algorithm. ### </summary> class BasicTemplateAlgorithm(QCAlgorithm): '''Basic template algorithm simply initializes the date range and cash''' def Initialize(self): '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.''' self.SetStartDate(2017,1, 10) #Set Start Date self.SetEndDate(2018,12,31) #Set End Date self.SetCash(10000) #Set Strategy Cash # Find more symbols here: http://quantconnect.com/data #self.AddEquity("SPY",Resolution.Minute) self.AddForex("EURUSD", Resolution.Minute, Market.Oanda) self.AddData(predEURUSDASK, "predEURUSDASK", Resolution.Hour, fillforward=True) self.AddData(predEURUSDBID, "predEURUSDBID", Resolution.Hour, fillforward=True) self.SetTimeZone("Etc/GMT0") self.Debug("Everything loaded") self.risk = 0.2 self.Securities["EURUSD"].SetLeverage(500) self.last_hour = 0 def OnData(self, data): if (data.ContainsKey("predEURUSDASK") or data.ContainsKey("predEURUSDBID")) and data.ContainsKey("EURUSD"): if self.last_hour == data["EURUSD"].Time.hour: return else: self.last_hour = data["EURUSD"].Time.hour quoteBar = data["EURUSD"] self.Log(f"Time: {quoteBar.EndTime}") #The time the period closes self.Log(f"Open: {quoteBar.Open}") # Retrieve High Ask Price from object highASK=data["predEURUSDASK"].Value self.Log(f"High ASK: {highASK}") # User variables highASKOpendiff = highASK- quoteBar.Open self.Log(f"highASKOpendiff: {highASKOpendiff}") BuyTPASK=highASKOpendiff*1 self.Log(f"BuyTPASK: {BuyTPASK}") BuySLASK=highASKOpendiff*10 self.Log(f"BuySLASK: {BuySLASK}") # Retrieve Low Bid Price from object lowBID=data["predEURUSDBID"].Value self.Log(f"Low BID: {lowBID}") # User variables OpenLowBIDdiff = quoteBar.Open - lowBID self.Log(f"OpenLowBIDdiff: {OpenLowBIDdiff}") SellTPBID=OpenLowBIDdiff*1 self.Log(f"SellTPBID: {SellTPBID}") SellSLBID=OpenLowBIDdiff*10 self.Log(f"SellSLBID: {SellSLBID}") qty = math.floor(self.Portfolio.Cash * self.risk/self.Securities["EURUSD"].Price) #MarginRemaining if highASKOpendiff >= OpenLowBIDdiff: if not self.Portfolio.Invested: self.Buy("EURUSD", qty) # every hour #Approach 1: self.SetHolding("EURUSD",0.2) averageFillPrice = self.Portfolio["EURUSD"].AveragePrice self.LimitOrder("EURUSD", -qty, (averageFillPrice +BuyTPASK)) self.StopMarketOrder("EURUSD", -qty, (averageFillPrice -BuySLASK)) else: if not self.Portfolio.Invested: self.Sell("EURUSD", qty) averageFillPrice = self.Portfolio["EURUSD"].AveragePrice self.LimitOrder("EURUSD", qty, (averageFillPrice -SellTPBID)) self.StopMarketOrder("EURUSD", qty, (averageFillPrice + SellSLBID)) #else: #return def OnOrderEvent(self, orderEvent): order = self.Transactions.GetOrderById(orderEvent.OrderId) if order.Status == OrderStatus.Filled: if order.Type == OrderType.Limit or order.Type == OrderType.StopMarket: self.Transactions.CancelOpenOrders(order.Symbol) if order.Status == OrderStatus.Canceled: self.Log(str(orderEvent)) def EveryHour(self): pass class predEURUSDASK(PythonData): #"Import custom data from a csv file" def GetSource(self, config, date, isLiveMode): return SubscriptionDataSource("http://sensedrive.science/files/EURUSD1H_CHL_ASK_cat.csv", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, isLiveMode): if not (line.strip() and line[0].isdigit()): return None index = predEURUSDASK() index.Symbol = config.Symbol try: data = line.split(',') index.Time = datetime.strptime(data[0], "%Y-%m-%d %H:%M:%S") ### Retrieve "predicted" High Ask Price index.Value = Decimal(data[2]) except: return None return index class predEURUSDBID(PythonData): #"Import custom data from a csv file" def GetSource(self, config, date, isLiveMode): #Changed BID -> ASK return SubscriptionDataSource("http://sensedrive.science/files/EURUSD1H_CHL_ASK_cat.csv", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, isLiveMode): if not (line.strip() and line[0].isdigit()): return None index = predEURUSDBID() index.Symbol = config.Symbol try: data = line.split(',') index.Time = datetime.strptime(data[0], "%Y-%m-%d %H:%M:%S") ### Retrieve "predicted" Low Bid Price index.Value = Decimal(data[3]) except: return None return index