Overall Statistics
Total Trades
3912
Average Win
0.08%
Average Loss
-0.01%
Compounding Annual Return
103.844%
Drawdown
1.200%
Expectancy
0.921
Net Profit
20.131%
Sharpe Ratio
8.031
Loss Rate
74%
Win Rate
26%
Profit-Loss Ratio
6.29
Alpha
0.482
Beta
0.098
Annual Standard Deviation
0.061
Annual Variance
0.004
Information Ratio
5.064
Tracking Error
0.082
Treynor Ratio
4.965
Total Fees
$8.30
namespace QuantConnect.Algorithm.CSharp
{
    public class TestRenkoConsolidator : QCAlgorithm
    {
    	private double renkoSize = 0.25;
    	private string symString = "LTCUSD";
    	private double startingCash = 100;
    	private decimal risk = 0.01m;
    	private BarDirection currentBarDirection = BarDirection.NoDelta;
    	
    	private RenkoBar currentBar;
    	
        public override void Initialize()
        {
            SetStartDate(2017, 06, 01);  
            SetEndDate(2017, 09, 02);    
            
            SetCash(startingCash);

            AddCrypto(symString, Resolution.Second, Market.GDAX);
            SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash);
            
            var renko = new RenkoConsolidator((decimal)renkoSize, RenkoType.Wicked);
            renko.DataConsolidated += OnRenkoBar;
            SubscriptionManager.AddConsolidator(symString, renko);
            
            Debug("RenkoSize: " + renkoSize + " | Risk: " + risk);
        }
        
        public override void OnData(Slice data) 
        {
        }
        
        public void OnRenkoBar(object sender, RenkoBar bar)
        {
        	currentBar = bar;
        	currentBarDirection = currentBar.Direction;
        	CheckForExitCondition();
        	CheckForEntryCondition();
        }
        
        private void CheckForExitCondition()
        {
        	if(currentBarDirection == BarDirection.Falling)
        	{
        		Liquidate(symString);
        	}
        }
        
        private void CheckForEntryCondition()
        {
        	Transactions.CancelOpenOrders(symString);
        	if(currentBarDirection == BarDirection.Rising)
        	{
        		decimal units = UnitsToBuy();
        		decimal limitPrice = currentBar.Close;
        		
        		LimitOrder(symString, units, limitPrice);
        	}
        }
        
        private decimal UnitsToBuy()
        {
        	decimal dollarsAtRisk = Portfolio.Cash * risk;		
        	decimal riskPerUnit = currentBar.Close - (decimal)(2 * renkoSize);
        	decimal unitsToBuy = dollarsAtRisk / riskPerUnit;
        	
        	return unitsToBuy;
        }	
    }
}