| Overall Statistics |
|
Total Trades 1745 Average Win 4.31% Average Loss -4.16% Compounding Annual Return 19.606% Drawdown 59.500% Expectancy 0.078 Net Profit 435.495% Sharpe Ratio 0.502 Probabilistic Sharpe Ratio 3.126% Loss Rate 47% Win Rate 53% Profit-Loss Ratio 1.03 Alpha 0.202 Beta 0.112 Annual Standard Deviation 0.425 Annual Variance 0.181 Information Ratio 0.263 Tracking Error 0.438 Treynor Ratio 1.91 Total Fees $0.00 |
from Execution.VolumeWeightedAveragePriceExecutionModel import VolumeWeightedAveragePriceExecutionModel
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Indicators")
AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
from datetime import datetime
import decimal as d
class UncoupledOptimizedRadiator(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2010, 8, 8) # Set Start Date
self.SetEndDate(datetime.now())
self.end_date = datetime.now()
self.SetCash(100000) # Set Strategy Cash
# self.AddEquity("SPY", Resolution.Minute)
# self.SetExecution(VolumeWeightedAveragePriceExecutionModel())
self.SetRiskManagement(MaximumUnrealizedProfitPercentPerSecurity(0.03))
self.AddForex("EURJPY", Resolution.Minute, Market.Oanda)
self.__macd = self.MACD("EURJPY", 33, 91, 34, MovingAverageType.Exponential, Resolution.Minute)
self.__previous = datetime.min
self.pair = "EURJPY"
# self.PlotIndicator("MACD", True, self.__macd, self.__macd.Signal)
# self.PlotIndicator
self.position = 0
self.past_delta = 0.0
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
'''
if not self.__macd.IsReady: return
# holdings = self.Portfolio["EURJPY"].Quantity
# self.Log(holdings)
# self.Debug(str(self.Time) + " Purchasing AAPL: ")
tolerance = 0
# self.Log(self.__macd)
current_delta = float(self.__macd.Fast.Current.Value) - float(self.__macd.Slow.Current.Value)
# orderTicket = self.MarketOrder("EURJPY", 1)
# self.Debug("Past" +str(self.past_delta ))
# self.Debug("Fast"+str(self.__macd.Fast.Current.Value ) + " , Slow" + str(self.__macd.Slow.Current.Value))
# self.Debug("Delta"+str( float(self.__macd.Fast.Current.Value) - float(self.__macd.Slow.Current.Value)))
# price = data.Close
onePercent = d.Decimal(1.01)
if self.past_delta > 0.00 and current_delta < 0.00:
if not self.Portfolio.Invested:
price = data[self.pair].Close
onePercent = d.Decimal(1.01)
self.Buy(self.pair, 1000000)
self.LimitOrder(self.pair, -1000000, price * onePercent)
self.StopMarketOrder(self.pair, -1000000, price / onePercent)
if self.past_delta < 0.00 and current_delta > 0.00:
if not self.Portfolio.Invested:
price = data[self.pair].Close
onePercent = d.Decimal(1.01)
self.Sell(self.pair, 1000000)
self.LimitOrder(self.pair, 1000000, price / onePercent)
self.StopMarketOrder(self.pair, 1000000, price * onePercent)
self.past_delta = current_delta
self.__previous = self.Time
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))