Overall Statistics
Total Trades
368
Average Win
0.93%
Average Loss
-0.04%
Compounding Annual Return
-65.769%
Drawdown
9.300%
Expectancy
-0.617
Net Profit
-9.048%
Sharpe Ratio
-7.372
Loss Rate
98%
Win Rate
2%
Profit-Loss Ratio
22.50
Alpha
-0.973
Beta
0.077
Annual Standard Deviation
0.134
Annual Variance
0.018
Information Ratio
-4.941
Tracking Error
0.168
Treynor Ratio
-12.782
Total Fees
$0.00
using System;
using System.Collections;
using System.Collections.Generic; 
using QuantConnect.Securities;  
using QuantConnect.Models;   

namespace QuantConnect 
{   
    public class TestYahooCsv : QCAlgorithm
    {   
        private const string _symbol = "ITUB4F.SA";
        MyEMA emaFast = new MyEMA(15);
        MyEMA emaSlow = new MyEMA(50);
        
        public override void Initialize()
        {
            SetStartDate(2015, 6, 1);
            SetEndDate(DateTime.Now);
            SetCash(5000);
            //Quandl Indexes 
            AddData<YahooCsv>(_symbol);
            //AddSecurity(SecurityType.Equity, _symbol, Resolution.Minute);
            //SetRunMode...
        }



        private DateTime previous;

        /// <summary>
        /// Yahoo Daily Bars Event Handler: Daily bars arrive here for processing.
        /// </summary>
        public void OnData(YahooCsv data)
        {
            //Log("data! "+data.Time);
            emaFast.AddSample(data.Value);
            emaSlow.AddSample(data.Value);
            int holdings = Portfolio[_symbol].Quantity;
            
            
            const decimal tolerance = 0.00015m;
            
            // 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 (emaFast.EMA > emaSlow.EMA * (1 + tolerance)){
                    Log("BUY  >> " + Securities[_symbol].Price);
                    SetHoldings(_symbol, 1.0);
                }
            }

            // we only want to liquidate if we're currently long
            // if the fast is less than the slow we'll liquidate our long
            if (holdings > 0 && emaFast.EMA < emaSlow.EMA){
                Log("SELL >> " + Securities[_symbol].Price);
                Liquidate(_symbol);    
            }
            
            /*if (holdings <= 0){
                if (emaFast.EMA > emaSlow.EMA){
                    Order(_symbol, Math.Abs(holdings)+70);
                }
            } else if (holdings >= 0){
                if (emaFast.EMA < emaSlow.EMA){
                    Order(_symbol,-(holdings+70));
                }
            }*/
            
            /*
            
            // a couple things to notice in this method:
            //  1. We never need to 'update' our indicators with the data, the engine takes care of this for us
            //  2. We can use indicators directly in math expressions
            //  3. We can easily plot many indicators at the same time


            // only once per day
            if (previous.Date == data.Time.Date) return;

            // define a small tolerance on our checks to avoid bouncing
            const decimal tolerance = 0.00015m;
            var holdings = Portfolio[_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 (fast > slow * (1 + tolerance))
                {
                    Log("BUY  >> " + Securities[_symbol].Price);
                    SetHoldings(_symbol, 1.0);
                }
            }

            // we only want to liquidate if we're currently long
            // if the fast is less than the slow we'll liquidate our long
            if (holdings > 0 && fast < slow)
            {
                Log("SELL >> " + Securities[_symbol].Price);
                Liquidate(_symbol);    
            }

            Plot(_symbol, "Price", data.Value);
            Plot("Ribbon", "Price", data.Value);
            
            // easily plot indicators, the series name will be the name of the indicator
            Plot(_symbol, fast, slow);
            Plot("Ribbon", ribbon);

            previous = data.Time;
            */
        }
    }
}
using System.Globalization;

namespace QuantConnect {


    /*
    *   QuantConnect University: Generic Yahoo Data Importer:
    *
    *   Import Yahoo data using only a symbol. Be sure to confirm yahoo has the
    *   data you're requesting.
    */
    public class YahooCsv : BaseData
    {
        public decimal Open = 0;
        public decimal High = 0;
        public decimal Low = 0;
        public decimal Close = 0;
//        public decimal AdjustedClose = 0;
        public decimal Volume = 0;

        public YahooCsv()
        {
            this.Symbol = "";
        }
        
        /// <summary>
        /// Return the URL external source for the data: QuantConnect will download it an read it line by line automatically:
        /// </summary>
        public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLive)
        {
            //QUANDL WRAPPER ON YAHOO FINANCE API TO SORT DATA:
            //https://www.quandl.com/api/v1/datasets/YAHOO/INDEX_SPY.csv?trim_start=2000-01-01&trim_end=2014-12-03&sort_order=asc
            //return new SubscriptionDataSource("https://www.quandl.com/api/v1/datasets/YAHOO/" + config.Symbol + ".csv?trim_start=" + startDate + "&trim_end=" + endDate + "&sort_order=asc&exclude_headers=true", SubscriptionTransportMedium.RemoteFile);
            
            
            //var startDate = "1433769540";
            //var endDate = "1433781240";
            
            var startDate = (int) (new DateTime(2015, 3, 1).Subtract(new DateTime(1970, 1,1)).TotalMilliseconds / 1000);
            var endDate = (int) (DateTime.Now.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds / 1000);
            
            var url = "http://newnode-pnucci.rhcloud.com/stock/yahoocsv?s=" + config.Symbol + "&d1=" + startDate + "&d2=" + endDate;
            System.Diagnostics.Debug.WriteLine("------------------ url: " + url);
            
            return new SubscriptionDataSource(url, SubscriptionTransportMedium.RemoteFile);
        }
        
        /// <summary>
        /// Convert each line of the file above into an object.
        /// </summary>
        public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLive)
        {
            YahooCsv yBar = new YahooCsv();

            try
            {
                string[] data = line.Split(',');
                //Required.
                yBar.Symbol = config.Symbol;
                //yBar.Time = DateTime.ParseExact(data[0], "yyyy-MM-dd", CultureInfo.InvariantCulture);
                yBar.Time = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddMilliseconds(ulong.Parse(data[0])*1000);
                
                //User configured / optional data on each bar:
                yBar.Open = Convert.ToDecimal(data[1]);
                yBar.Close = Convert.ToDecimal(data[2]);
                yBar.High = Convert.ToDecimal(data[3]);
                yBar.Low = Convert.ToDecimal(data[4]);
                yBar.Volume = Convert.ToDecimal(data[5]);
                //yBar.AdjustedClose = Convert.ToDecimal(data[6]);
                
                //This is the value the engine uses for portfolio calculations
                yBar.Value = yBar.Close;
            }
            catch {   
            }

            return yBar;
        }
    }
}
namespace QuantConnect {
    
    using QuantConnect.Securities;
    using QuantConnect.Models;

    public class MyEMA {
        private decimal _period;
        private decimal _ema;
        private int _samples;
        public decimal EMA{
            get {return _ema;}
        }
        public MyEMA(decimal period){
            this._period = period;
            this._samples = 0;
        }
        public decimal AddSample(decimal price){
            if (_samples == 0){
                _ema = price;
            } else {
                _ema = (1/_period)*price + ((_period-1)/_period)*_ema;
            }
            _samples++;
            return _ema;
        }
    }

}