| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
using NodaTime;
namespace QuantConnect
{
/*
* Demonstration of Problem on data timing when plotting in the "cloud" Vs
* desktop
*/
public class DataTimingProblem : QCAlgorithm
{
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
string _co ="CO";
//Start and End Date range for the backtest:
SetStartDate(2016, 07, 26);
SetEndDate(2016, 07, 28);
//Cash allocation
SetCash(25000);
//Add as many securities as you like. All the data will be passed into the event handler:
AddData<RCL>(_co, Resolution.Tick);
var stockPlot = new Chart("Market Price Plot");
var assetPrice = new Series("Price", SeriesType.Line, 0);
var rcCA1 = new Series("C1");
stockPlot.AddSeries(assetPrice);
AddChart(stockPlot);
}
// Event handler
public void OnData(RCL data)
{
// Compiler suggests implements "OnData(RCL data){...}" method
// but it seems the method has never been invoked
// so an empty implementation here just for suppression
// of compiler warning
}
// Event handler - plot and print the custom data
public void OnData(Ticks data)
{
List<Tick> targetData = data["CO"];
foreach (var t in targetData)
{
Plot("Market Price Plot", "Price", t.Value);
// print out data for monitoring
System.Console.WriteLine("time & price: " + t.Time + t.Value);
}
}
public class RCL : Tick
{
public decimal CL = 0; // only one field
public RCL()
{
this.Symbol = "CO";
}
public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLive)
{
var url = "https://dl.dropboxusercontent.com/u/1049831/For_QC/rcoil20160727to28.csv";
return new SubscriptionDataSource(url, SubscriptionTransportMedium.RemoteFile);
}
public override BaseData Reader(SubscriptionDataConfig config, string line, System.DateTime date, bool isLive)
{
RCL rcBar = new RCL();
try
{
string[] data = line.Split(',');
rcBar.Symbol = config.Symbol;
/*
* Parse date time using NodaTime
* the datetime of custom data is in UTC
* All my subsequent data manipulation is in Chicago timezone
* So time is converted to Chicago time zone after import
*/
OffsetDateTime defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero); // default result if parse fails
NodaTime.Text.OffsetDateTimePattern pattern =
NodaTime.Text.OffsetDateTimePattern.Create("yyyy-MM-dd HH:mm:sso<G>", CultureInfo.InvariantCulture, defaultValue);
var parsedResult = pattern.Parse(data[0]); // this is the result of datatime parsing
Instant instant = parsedResult.Value.ToInstant(); // convert the result into NodaTime instant
DateTimeZone targetedTimezoneId = DateTimeZoneProviders.Tzdb["America/Chicago"]; // Chicago timezone ID
ZonedDateTime dtTargetedZone = instant.InZone(targetedTimezoneId); // convert from UTC to Chicago
/*
* Convert from NodaTime ZonedDateTime to System.DataTime typeof
* as required in BaseData
*/
rcBar.Time = new System.DateTime(dtTargetedZone.Year, dtTargetedZone.Month,
dtTargetedZone.Day, dtTargetedZone.Hour,
dtTargetedZone.Minute, dtTargetedZone.Second,
DateTimeKind.Local);
// Parse data
// for simplicity, only parse one column of data as example
rcBar.CL = Convert.ToDecimal(data[4]);
rcBar.Value = rcBar.CL;
}
catch
{}
return rcBar;
}
}
}
}