302 lines
11 KiB
C#
302 lines
11 KiB
C#
/*
|
|
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
|
|
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
/**********************************************************
|
|
* USING NAMESPACES
|
|
**********************************************************/
|
|
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using QuantConnect.Data;
|
|
using QuantConnect.Indicators;
|
|
|
|
namespace QuantConnect.Algorithm
|
|
{
|
|
/********************************************************
|
|
* CLASS DEFINITIONS
|
|
*********************************************************/
|
|
public partial class QCAlgorithm
|
|
{
|
|
/********************************************************
|
|
* CLASS PRIVATE VARIABLES
|
|
*********************************************************/
|
|
private Dictionary<string, Chart> _charts = new Dictionary<string, Chart>();
|
|
private Dictionary<string, string> _runtimeStatistics = new Dictionary<string, string>();
|
|
|
|
/********************************************************
|
|
* CLASS PUBLIC PROPERTIES
|
|
*********************************************************/
|
|
/// <summary>
|
|
/// Access to the runtime statistics property. User provided statistics.
|
|
/// </summary>
|
|
/// <remarks> RuntimeStatistics are displayed in the head banner in live trading</remarks>
|
|
public Dictionary<string, string> RuntimeStatistics
|
|
{
|
|
get
|
|
{
|
|
return _runtimeStatistics;
|
|
}
|
|
}
|
|
|
|
/********************************************************
|
|
* CLASS METHODS
|
|
*********************************************************/
|
|
/// <summary>
|
|
/// Add a Chart object to algorithm collection
|
|
/// </summary>
|
|
/// <param name="chart">Chart object to add to collection.</param>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void AddChart(Chart chart)
|
|
{
|
|
if (!_charts.ContainsKey(chart.Name))
|
|
{
|
|
_charts.Add(chart.Name, chart);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart using string series name, with value.
|
|
/// </summary>
|
|
/// <param name="series">Name of the plot series</param>
|
|
/// <param name="value">Value to plot</param>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot(string series, decimal value)
|
|
{
|
|
//By default plot to the primary chart:
|
|
Plot("Strategy Equity", series, value);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Plot a chart using string series name, with int value. Alias of Plot();
|
|
/// </summary>
|
|
/// <remarks> Record(string series, int value)</remarks>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Record(string series, int value)
|
|
{
|
|
Plot(series, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart using string series name, with double value. Alias of Plot();
|
|
/// </summary>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Record(string series, double value)
|
|
{
|
|
Plot(series, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart using string series name, with decimal value. Alias of Plot();
|
|
/// </summary>
|
|
/// <param name="series"></param>
|
|
/// <param name="value"></param>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Record(string series, decimal value)
|
|
{
|
|
//By default plot to the primary chart:
|
|
Plot(series, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart using string series name, with double value.
|
|
/// </summary>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot(string series, double value) {
|
|
Plot(series, (decimal)value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart using string series name, with int value.
|
|
/// </summary>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot(string series, int value)
|
|
{
|
|
Plot(series, (decimal)value);
|
|
}
|
|
|
|
/// <summary>
|
|
///Plot a chart using string series name, with float value.
|
|
/// </summary>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot(string series, float value)
|
|
{
|
|
Plot(series, (decimal)value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart to string chart name, using string series name, with double value.
|
|
/// </summary>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot(string chart, string series, double value)
|
|
{
|
|
Plot(chart, series, (decimal)value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart to string chart name, using string series name, with int value
|
|
/// </summary>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot(string chart, string series, int value)
|
|
{
|
|
Plot(chart, series, (decimal)value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a chart to string chart name, using string series name, with float value
|
|
/// </summary>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot(string chart, string series, float value)
|
|
{
|
|
Plot(chart, series, (decimal)value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plot a value to a chart of string-chart name, with string series name, and decimal value. If chart does not exist, create it.
|
|
/// </summary>
|
|
/// <param name="chart">Chart name</param>
|
|
/// <param name="series">Series name</param>
|
|
/// <param name="value">Value of the point</param>
|
|
public void Plot(string chart, string series, decimal value)
|
|
{
|
|
//Ignore the reserved chart names:
|
|
if ((chart == "Strategy Equity" && series == "Equity") || (chart == "Daily Performance") || (chart == "Meta"))
|
|
{
|
|
throw new Exception("Algorithm.Plot(): 'Equity', 'Daily Performance' and 'Meta' are reserved chart names created for all charts.");
|
|
}
|
|
|
|
// If we don't have the chart, create it:
|
|
if (!_charts.ContainsKey(chart))
|
|
{
|
|
_charts.Add(chart, new Chart(chart));
|
|
}
|
|
|
|
var thisChart = _charts[chart];
|
|
if (!thisChart.Series.ContainsKey(series))
|
|
{
|
|
//Number of series in total.
|
|
var seriesCount = (from x in _charts.Values select x.Series.Count).Sum();
|
|
|
|
if (seriesCount > 10)
|
|
{
|
|
Error("Exceeded maximum series count: Each backtest can have up to 10 series in total.");
|
|
return;
|
|
}
|
|
|
|
//If we don't have the series, create it:
|
|
thisChart.AddSeries(new Series(series));
|
|
}
|
|
|
|
var thisSeries = thisChart.Series[series];
|
|
if (thisSeries.Values.Count < 4000 || _liveMode)
|
|
{
|
|
thisSeries.AddPoint(Time, value, _liveMode);
|
|
}
|
|
else
|
|
{
|
|
Debug("Exceeded maximum points per chart, data skipped.");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plots the value of each indicator on the chart
|
|
/// </summary>
|
|
/// <param name="chart">The chart's name</param>
|
|
/// <param name="indicators">The indicatorsto plot</param>
|
|
/// <seealso cref="Plot(string,string,decimal)"/>
|
|
public void Plot<T>(string chart, params IndicatorBase<T>[] indicators)
|
|
where T : BaseData
|
|
{
|
|
foreach (var indicator in indicators)
|
|
{
|
|
Plot(chart, indicator.Name, indicator);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Set a runtime statistic for the algorithm. Runtime statistics are shown in the top banner of a live algorithm GUI.
|
|
/// </summary>
|
|
/// <param name="name">Name of your runtime statistic</param>
|
|
/// <param name="value">String value of your runtime statistic</param>
|
|
/// <seealso cref="LiveMode"/>
|
|
public void SetRuntimeStatistic(string name, string value)
|
|
{
|
|
//If not set, add it to the dictionary:
|
|
if (!_runtimeStatistics.ContainsKey(name))
|
|
{
|
|
_runtimeStatistics.Add(name, value);
|
|
}
|
|
|
|
//Set
|
|
_runtimeStatistics[name] = value;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Set a runtime statistic for the algorithm. Runtime statistics are shown in the top banner of a live algorithm GUI.
|
|
/// </summary>
|
|
/// <param name="name">Name of your runtime statistic</param>
|
|
/// <param name="value">Decimal value of your runtime statistic</param>
|
|
public void SetRuntimeStatistic(string name, decimal value)
|
|
{
|
|
SetRuntimeStatistic(name, value.ToString());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Set a runtime statistic for the algorithm. Runtime statistics are shown in the top banner of a live algorithm GUI.
|
|
/// </summary>
|
|
/// <param name="name">Name of your runtime statistic</param>
|
|
/// <param name="value">Int value of your runtime statistic</param>
|
|
public void SetRuntimeStatistic(string name, int value)
|
|
{
|
|
SetRuntimeStatistic(name, value.ToString());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Set a runtime statistic for the algorithm. Runtime statistics are shown in the top banner of a live algorithm GUI.
|
|
/// </summary>
|
|
/// <param name="name">Name of your runtime statistic</param>
|
|
/// <param name="value">Double value of your runtime statistic</param>
|
|
public void SetRuntimeStatistic(string name, double value)
|
|
{
|
|
SetRuntimeStatistic(name, value.ToString());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the chart updates by fetch the recent points added and return for dynamic plotting.
|
|
/// </summary>
|
|
/// <param name="clearChartData"></param>
|
|
/// <returns>List of chart updates since the last request</returns>
|
|
/// <remarks>GetChartUpdates returns the latest updates since previous request.</remarks>
|
|
public List<Chart> GetChartUpdates(bool clearChartData = false)
|
|
{
|
|
var updates = _charts.Values.Select(chart => chart.GetUpdates()).ToList();
|
|
|
|
if (clearChartData)
|
|
{
|
|
// we can clear this data out after getting updates to prevent unnecessary memory usage
|
|
foreach (var chart in _charts)
|
|
{
|
|
foreach (var series in chart.Value.Series)
|
|
{
|
|
series.Value.Values.Clear();
|
|
}
|
|
}
|
|
}
|
|
return updates;
|
|
}
|
|
|
|
} // End Partial Algorithm Template - Plotting.
|
|
|
|
} // End QC Namespace
|