| Overall Statistics |
|
Total Trades 122 Average Win 0.00% Average Loss 0.00% Compounding Annual Return -92.125% Drawdown 3.900% Expectancy 0.787 Net Profit -1.383% Sharpe Ratio 16.924 Probabilistic Sharpe Ratio 0% Loss Rate 95% Win Rate 5% Profit-Loss Ratio 35.34 Alpha 0.07 Beta 1.243 Annual Standard Deviation 0.075 Annual Variance 0.006 Information Ratio 20.777 Tracking Error 0.015 Treynor Ratio 1.016 Total Fees $0.00 Estimated Strategy Capacity $140000.00 Lowest Capacity Asset BTCUSD XJ |
class Ema60Breakout(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 6, 21)
self.SetEndDate(2021, 6,22)
self.SetCash("EUR", 10000)
self.SetCash("BTC",1)
self.order_id = -1
self.prezzo = 0
self.symbol = self.AddCrypto("BTCUSD", Resolution.Second).Symbol
oneMinuteConsolidator = TradeBarConsolidator(timedelta(minutes=1))
self.days = 0
self.order_id = 0
# create two moving averages
#self.fast = self.EMA(self.symbol, 30, Resolution.Minute) ## ema 30 1 minuto
self.fast = ExponentialMovingAverage("1minEMA", 30)
#self.slow = self.EMA(self.symbol, 60, Resolution.Minute) ## ema 60 1 minuto
self.slow = ExponentialMovingAverage("1minEMA", 60)
#self.RegisterIndicator(self.symbol, self.fast, oneMinuteConsolidator)
#self.RegisterIndicator(self.symbol, self.slow, oneMinuteConsolidator)
self.SubscriptionManager.AddConsolidator("BTCUSD", oneMinuteConsolidator)
oneMinuteConsolidator.DataConsolidated += self.OneMinuteBarHandler
self.SetWarmup(700, Resolution.Minute)
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
'''
ema30 = self.fast.Current.Value
ema60 = self.slow.Current.Value
if self.IsWarmingUp:
return
### per la posizione in long
self.lastOpen = data['BTCUSD'].Open
self.lastClose = data['BTCUSD'].Close
self.lastHigh = data['BTCUSD'].High
self.lastLow = data['BTCUSD'].Low
self.lastTime = self.Time
#else if IsTrading == True and len(open_orders == 0):
# self.StopMarketOrder("BTCUSD", -self.Portfolio['XIV'].Quantity, prezzo)
# self.StopMarketOrder("BTCUSD", -self.Portfolio['XIV'].Quantity, self.prezzo*(1+0.01))
# self.days = 0
def OneMinuteBarHandler(self, sender, bar):
# With hourly data the bar period is 1-hour
if self.IsWarmingUp:
self.fast.Update(bar.EndTime, bar.Close)
self.slow.Update(bar.EndTime, bar.Close)
return
self.fast.Update(bar.EndTime, bar.Close)
self.slow.Update(bar.EndTime, bar.Close)
ema30 = self.fast.Current.Value
ema60 = self.slow.Current.Value
#self.Log(f"Ema30: {ema30}, ema60: {ema60}, close: {bar.Close}, high: {bar.High}")
if len(self.Transactions.GetOpenOrders()) == 0:
if ema30 < ema60 and bar.High >= ema60 and bar.Close < ema60:
self.current = self.Time
self.Log("Qui è successo")
self.ticket = self.order_ticket = self.StopLimitOrder("BTCUSD", 0.001, ema60, ema60 + 3)
self.prezzo = ema60
self.days = 1
self.order_id = self.ticket.OrderId
#self.Log(ema30)
#self.Log(ema60)
#self.Log(data['BTCUSD'].High)
#self.Log(data['BTCUSD'].Close)
elif len(self.Transactions.GetOpenOrders()) == 1:
self.days += 1
if self.days == 4:
self.ticket.Cancel("Ordine Cancellato")
self.days = 0
def OnOrderEvent(self, orderEvent):
order = self.Transactions.GetOrderById(orderEvent.OrderId).Id
if order == self.order_id:
if orderEvent.Status == OrderStatus.Filled:
self.StopMarketOrder("BTCUSD", -(self.Portfolio.CashBook["BTC"].Amount - 1), self.prezzo) ## piazzo i due ordini
self.LimitOrder("BTCUSD", -(self.Portfolio.CashBook["BTC"].Amount - 1), self.prezzo*(1+0.01))
self.Log(f"Creo due ordini.low: {self.lastLow}, high: {self.lastHigh}, time: {self.lastTime}")
self.days = 0
elif orderEvent.Status == OrderStatus.Filled:
self.Log(f"Cancello perchè fillato.low: {self.lastLow}, high: {self.lastHigh}, time: {self.lastTime}")
openOrders = self.Transactions.GetOpenOrders()
for x in openOrders:
self.Transactions.CancelOrder(x.Id)