Overall Statistics
Total Orders
266
Average Win
2.32%
Average Loss
-2.33%
Compounding Annual Return
23.219%
Drawdown
28.700%
Expectancy
0.196
Net Profit
69.258%
Sharpe Ratio
0.761
Sortino Ratio
0.634
Probabilistic Sharpe Ratio
32.344%
Loss Rate
40%
Win Rate
60%
Profit-Loss Ratio
1.00
Alpha
0.036
Beta
0.733
Annual Standard Deviation
0.224
Annual Variance
0.05
Information Ratio
-0.07
Tracking Error
0.181
Treynor Ratio
0.233
Total Fees
$2200.20
Estimated Strategy Capacity
$520000000.00
Lowest Capacity Asset
AAPL R735QTJ8XC9X
Portfolio Turnover
28.74%
#region imports
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Globalization;
    using System.Drawing;
    using QuantConnect;
    using System.Text.RegularExpressions;
    using QuantConnect.Algorithm.Framework;
    using QuantConnect.Algorithm.Framework.Selection;
    using QuantConnect.Algorithm.Framework.Alphas;
    using QuantConnect.Algorithm.Framework.Portfolio;
    using QuantConnect.Algorithm.Framework.Execution;
    using QuantConnect.Algorithm.Framework.Risk;
    using QuantConnect.Algorithm.Selection;
    using QuantConnect.Parameters;
    using QuantConnect.Benchmarks;
    using QuantConnect.Brokerages;
    using QuantConnect.Util;
    using QuantConnect.Interfaces;
    using QuantConnect.Algorithm;
    using QuantConnect.Indicators;
    using QuantConnect.Data;
    using QuantConnect.Data.Consolidators;
    using QuantConnect.Data.Custom;
    using QuantConnect.DataSource;
    using QuantConnect.Data.Fundamental;
    using QuantConnect.Data.Market;
    using QuantConnect.Data.UniverseSelection;
    using QuantConnect.Notifications;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Fees;
    using QuantConnect.Orders.Fills;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Scheduling;
    using QuantConnect.Securities;
    using QuantConnect.Securities.Equity;
    using QuantConnect.Securities.Future;
    using QuantConnect.Securities.Option;
    using QuantConnect.Securities.Forex;
    using QuantConnect.Securities.Crypto;   
    using QuantConnect.Securities.Interfaces;
    using QuantConnect.Storage;
    using QCAlgorithmFramework = QuantConnect.Algorithm.QCAlgorithm;
    using QCAlgorithmFrameworkBridge = QuantConnect.Algorithm.QCAlgorithm;
#endregion

public class BrainSentimentDataAlgorithm : QCAlgorithm
{
    private Symbol _symbol;
    private Symbol _datasetSymbol;
    private decimal? _latestSentimentValue;
    private int _targetHoldings = 0;

    public override void Initialize()
    {
        SetStartDate(2019, 1, 1);
        SetEndDate(2021, 7, 8);
        SetCash(100000);

        // Requesting data
        _symbol = AddEquity("AAPL", Resolution.Daily).Symbol;
        _datasetSymbol = AddData<BrainSentimentIndicator30Day>(_symbol).Symbol;

        /// Historical data
        var history = History<BrainSentimentIndicator30Day>(_datasetSymbol, 100, Resolution.Daily);
        Debug($"We got {history.Count()} items from our history request for {_datasetSymbol}");
        
        // Warm up historical sentiment values
        var previousSentimentValues = history.Select(x => x.Sentiment);
        foreach (var sentiment in previousSentimentValues)
        {
            Update(sentiment);
        }
    }

    private void Update(decimal sentiment)
    {
        if (_latestSentimentValue != null)
            {
                _targetHoldings = sentiment > _latestSentimentValue ? 1 : 0;
            }
        _latestSentimentValue = sentiment;
    }

    public override void OnData(Slice slice)
    {
        if (slice.ContainsKey(_datasetSymbol))
        {
            var sentiment = slice[_datasetSymbol].Sentiment;
            Update(sentiment);
        }

        if (!(slice.ContainsKey(_symbol) && slice[_symbol] != null))
        {
            return;
        }

        if (_targetHoldings==1 != Portfolio.Invested)
        {
            SetHoldings(_symbol, _targetHoldings);
        }
    }
}