Overall Statistics Total Trades 2582 Average Win 0.13% Average Loss -0.05% Compounding Annual Return -9.528% Drawdown 9.300% Expectancy -0.124 Net Profit -8.215% Sharpe Ratio -2.364 Loss Rate 74% Win Rate 26% Profit-Loss Ratio 2.42 Alpha -0.092 Beta -0.043 Annual Standard Deviation 0.041 Annual Variance 0.002 Information Ratio -1.977 Tracking Error 0.122 Treynor Ratio 2.256 Total Fees \$6621.54
```namespace QuantConnect {
public class EMA
{
private int _samples = 0;
private decimal _k = 0;

public EMA(int period)
{
Period = period;
_k = 2 / ((decimal)period + 1);
Reset();
}

public void Reset(){
Value = 0;
_samples = 0;
}

public decimal Value { get; set; }

public int Period {get; private set;}

public bool IsValid { get; private set; }

public void NewPeriodValue(decimal value)
{
if (Value == 0) {
Value = value;
return;
}

Value = _k * value + (1 - _k) * Value;
_samples++;

IsValid = _samples > Period;
}
}
}                        ```
```using System;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Market;
using QuantConnect.Indicators;

namespace QuantConnect
{
public class RenkoEMACrossoverAlgorithm : QCAlgorithm
{
private EMA _ema = new EMA(13);
private string _symbol = "SPY";

/// <summary>
/// Initializes the algorithm state.
/// </summary>
public override void Initialize()
{
SetStartDate(2014, 01, 01);
SetEndDate(2014, 11, 10);

// this is the simple constructor that will perform the renko logic to the Value
// property of the data it receives.

// break SPY into \$1 renko bricks and send that data to our 'OnRenkoBar' method
var renkoClose = new RenkoConsolidator(0.05m);
renkoClose.DataConsolidated += (sender, consolidated) =>
{
// call our event handler for renko data
HandleRenkoClose(consolidated);
};

// register the consolidator for updates
}

/// <summary>
/// We're doing our analysis in the OnRenkoBar method, but the framework verifies that this method exists, so we define it.
/// </summary>
{
var holdings = Portfolio[_symbol].Quantity;
if (data.Time.Hour > 13 && holdings > 0){
Log("SELL!!! After 1pm!!! >> " + Securities[_symbol].Price);
Liquidate(_symbol);
}
}

private DateTime Date {get; set;}
/// <summary>
/// This function is called by our renkoClose consolidator defined in Initialize()
/// </summary>
/// <param name="data">The new renko bar produced by the consolidator</param>
public void HandleRenkoClose(RenkoBar data)
{
if (Date.Day != data.Time.Day)
{
_ema.Reset();
Date = data.Time;
}

var price = data.Close;
_ema.NewPeriodValue(price);
if (!_ema.IsValid) return;

if (data.Time.Hour > 13) return; // no trading after 1pm
if (data.Time.Hour < 10) return; // no trading before 10am

Log(String.Format("Renko {0} - OHLC[{1}, {2}, {3}, {4}] - SMA - {5}", data.Time.ToString("o"), data.Open, data.High, data.Low, data.Close, _ema.Value));

var holdings = Portfolio[data.Symbol].Quantity;

// we only want to go long if we're currently short or flat
if (holdings <= 0)
{
// if the fast is greater than the slow, we'll go long
if (data.Close > _ema.Value)
{