Overall Statistics |
Total Trades 238 Average Win 6.35% Average Loss -3.56% Compounding Annual Return 1146.261% Drawdown 40.200% Expectancy 0.746 Net Profit 1488.291% Sharpe Ratio 8.643 Probabilistic Sharpe Ratio 99.432% Loss Rate 37% Win Rate 63% Profit-Loss Ratio 1.78 Alpha 6.038 Beta 1.288 Annual Standard Deviation 0.733 Annual Variance 0.538 Information Ratio 8.477 Tracking Error 0.72 Treynor Ratio 4.92 Total Fees $0.00 Estimated Strategy Capacity $250000.00 Lowest Capacity Asset ETHUSD E3 |
using System.Linq; using QuantConnect.Data; using QuantConnect.Util; using QuantConnect.Algorithm; using QuantConnect.DataSource; namespace QuantConnect.DataLibrary.Tests { /// <summary> /// Example algorithm using NFT Sales data as a source of alpha /// </summary> public class CryptoSlamNFTSalesAlgorithm : QCAlgorithm { private Symbol _nftSalesSymbol; private Symbol _ethSymbol; private decimal? _lastAvgSales = null; /// <summary> /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized. /// </summary> public override void Initialize() { SetStartDate(2020, 10, 07); //Set Start Date SetCash(10000); _ethSymbol = AddCrypto("ETHUSD", Resolution.Minute, Market.Bitfinex).Symbol; // Requesting data _nftSalesSymbol = AddData<CryptoSlamNFTSales>(_ethSymbol).Symbol; // Historical data var history = History<CryptoSlamNFTSales>(_nftSalesSymbol, 60, Resolution.Daily); Debug($"We got {history.Count()} items from our history request for {_ethSymbol} CryptoSlam NFT Sales data"); } /// <summary> /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. /// </summary> /// <param name="slice">Slice object keyed by symbol containing the stock data</param> public override void OnData(Slice slice) { // Retrieving data var data = slice.Get<CryptoSlamNFTSales>(); if (!data.IsNullOrEmpty()) { Debug(data[_nftSalesSymbol].ToString()); var currentAvgSales = data[_nftSalesSymbol].TotalPriceUSD / data[_nftSalesSymbol].TotalTransactions; // comparing the average sales changes, we will buy ethereum or hold cash if (_lastAvgSales != null && currentAvgSales > _lastAvgSales) { SetHoldings(_ethSymbol, 1); } else { SetHoldings(_ethSymbol, 0); } _lastAvgSales = currentAvgSales; } } } }