| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio NaN Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha NaN Beta NaN Annual Standard Deviation NaN Annual Variance NaN Information Ratio NaN Tracking Error NaN Treynor Ratio NaN Total Fees $0.00 |
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using QuantConnect.Data.Consolidators;
namespace QuantConnect.Algorithm.Examples
{
/// <summary>
/// Testing algorithm simply initializes the date range and cash
/// </summary>
public class TestingCustomDataAlgo : QCAlgorithm
{
/// <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(new DateTime(2010, 05, 03, 00, 00, 00));
SetEndDate(2010, 06, 01);
AddData<EURUSD>("EURUSD");
//create an event to handle the hourly bars
var consolidator = ResolveConsolidator("EURUSD", Resolution.Daily);
consolidator.DataConsolidated += HourBarHandler;
SubscriptionManager.AddConsolidator("EURUSD", consolidator);
var dtbConsolidator = new DailyTradeBarConsolidator();
dtbConsolidator.DataConsolidated += DayBarHandler;
SubscriptionManager.AddConsolidator("EURUSD", dtbConsolidator);
}
private void DayBarHandler(object sender, BaseData consolidated)
{
Console.WriteLine("\nDBH Consolidated Time: " + consolidated.Time.DayOfWeek + " at " + consolidated.Time);
}
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">TradeBars IDictionary object with your stock data</param>
public void OnData(EURUSD data)
{
//Console.WriteLine("Time: " + data.Time);
}
private void HourBarHandler(object sender, BaseData consolidated)
{
Console.WriteLine("\nConsolidated Time: " + consolidated.Time.DayOfWeek + " at " + consolidated.Time);
//Debug("\nConsolidated Daily Time: " + consolidated.Time);
}
}
/// <summary>
/// ad hoc fix for daily close issue
/// </summary>
public class DailyTradeBarConsolidator : DataConsolidator<TradeBar>
{
private TradeBar _working;
/// <summary>
/// OutputType returns a Type?
/// </summary>
public override Type OutputType
{
get { return typeof(TradeBar); }
}
/// <summary>
/// Update method
/// </summary>
/// <param name="data">Tradebar type</param>
public override void Update(TradeBar data)
{
if (_working != null && _working.Time.Date != data.Time.Date)
{
OnDataConsolidated(_working);
_working = null;
}
AggregateBar(ref _working, data);
}
/// <summary>
/// Aggregates the new 'data' into the 'workingBar'. The 'workingBar' will be
/// null following the event firing
/// </summary>
/// <param name="workingBar">The bar we're building, null if the event was just fired and we're starting a new trade bar</param>
/// <param name="data">The new data</param>
protected void AggregateBar(ref TradeBar workingBar, TradeBar data)
{
if (workingBar == null)
{
workingBar = new TradeBar
{
Time = data.Time,
Symbol = data.Symbol,
Open = data.Open,
High = data.High,
Low = data.Low,
Close = data.Close,
Volume = data.Volume,
DataType = MarketDataType.TradeBar,
Period = data.Period
};
}
else
{
//Aggregate the working bar
workingBar.Close = data.Close;
workingBar.Volume += data.Volume;
workingBar.Period += data.Period;
if (data.Low < workingBar.Low) workingBar.Low = data.Low;
if (data.High > workingBar.High) workingBar.High = data.High;
}
}
}
/// <summary>
/// EURUSD is a custom data type we create for this algorithm
/// </summary>
public class EURUSD : TradeBar
{
/// <summary>
/// Default initializer for EURUSD.
/// </summary>
public EURUSD()
{
Symbol = "EURUSD";
}
/// <summary>
/// Return the URL string source of the file. This will be converted to a stream
/// </summary>
public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
{
return @"..\..\..\Data\custom\EURUSD_1M_20100401_20141111.csv";
}
/// <summary>
/// Reader converts each line of the data source into BaseData objects. Each data type creates its own factory method, and returns a new instance of the object
/// each time it is called.
/// </summary>
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
{
EURUSD index = new EURUSD();
try
{
string[] data = line.Split(',');
string timeValue = (Convert.ToInt32(data[2])).ToString("00:00:00");
string dateValue = (Convert.ToInt32(data[1])).ToString("0000/00/00");
index.Symbol = data[0];
index.Time = DateTime.Parse(dateValue + " " + timeValue);
index.Open = Convert.ToDecimal(data[3], CultureInfo.InvariantCulture);
index.High = Convert.ToDecimal(data[4], CultureInfo.InvariantCulture);
index.Low = Convert.ToDecimal(data[5], CultureInfo.InvariantCulture);
index.Close = Convert.ToDecimal(data[6], CultureInfo.InvariantCulture);
index.Value = index.Close;
}
catch (Exception ex)
{
ex.ToString();
}
return index;
}
}
}