| 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;
}
}
}
}