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 |
/* * Notice this algorithm references QuantConnect.Logging which is unfortunately not legal in back test * So it is useful only on your local machine which runs a clone of Lean. * * To get it to compile on QuantConnect, I have commented out all references to the logging functions * Copy this algorithm into your QuantConnect.Algorithm.CSharp folder in your QuantConnect.Lean project * and then uncomment the using, the declaration, the initialization and the call to mylog on OnData. * * You also need to add a class called CustomFileLogHandler.cs in your QuantConnect.Logging project in * your QuantConnect.Lean solution. That file is also a part of this Project, but it is all commented * out because QC does not allow you to reference the IO dll in the System namespace. Add the file to the Logging project and * uncomment the file's contents. * */ using System; using System.Collections.Generic; using QuantConnect.Algorithm; using QuantConnect.Data.Market; // Uncomment this using statement //using QuantConnect.Logging; using QuantConnect.Util; namespace QuantConnect { /// <summary> /// Sample for adding custom logging to your Local copy of Lean /// </summary> public class FileLoggingSampleAlgorithm : QCAlgorithm { #region "Custom Logging" // Uncomment this declaration //private ILogHandler mylog; #endregion /// <summary> /// Usual Initialize summary /// </summary> public override void Initialize() { //Initialize dates SetStartDate(new DateTime(2016, 1, 11)); SetEndDate(new DateTime(2016, 1, 14)); SetCash(50000); AddSecurity(SecurityType.Equity, "SPY", Resolution.Minute); // Uncomment this instantition //mylog = Composer.Instance.GetExportedValueByTypeName<ILogHandler>("CustomFileLogHandler"); } /// <summary> /// Usuall OnData summary /// </summary> /// <param name="data">Trade bars for the event handler</param> public void OnData(TradeBars data) { foreach (KeyValuePair<Symbol, TradeBar> kvp in data) { // Add your indicator values to the logmsg string logmsg = string.Format( "{0},{1},{2},{3},{4},{5},{6}", kvp.Value.EndTime.ToShortTimeString(), kvp.Value.Symbol.Value, Math.Round(kvp.Value.Open, 4), Math.Round(kvp.Value.High, 4), Math.Round(kvp.Value.Low, 4), Math.Round(kvp.Value.Close, 4), kvp.Value.Volume ); // Uncomment this call //mylog.Debug(logmsg); } } } }
/* namespace QuantConnect.Logging { /// <summary> /// Provides an implementation of <see cref="ILogHandler"/> that writes all log messages to a file on disk. /// </summary> public class CustomFileLogHandler : ILogHandler { // we need to control synchronization to our stream writer since it's not inherently thread-safe private readonly object _lock = new object(); private readonly Lazy<TextWriter> _writer; /// <summary> /// Initializes a new instance of the <see cref="FileLogHandler"/> class to write messages to the specified file path. /// The file will be opened using <see cref="FileMode.Append"/> /// </summary> /// <param name="filepath">The file path use to save the log messages</param> public CustomFileLogHandler(string filepath) { _writer = new Lazy<TextWriter>( () => new StreamWriter(File.Open(filepath, FileMode.Append, FileAccess.Write, FileShare.Read)) ); } /// <summary> /// Initializes a new instance of the <see cref="FileLogHandler"/> class using 'log.txt' for the filepath. /// </summary> public CustomFileLogHandler() : this("mylog.csv") { if (File.Exists("mylog.csv")) File.Delete("mylog.csv"); } /// <summary> /// Write error message to log /// </summary> /// <param name="text">The error text to log</param> public void Error(string text) { WriteMessage(text, "ERROR"); } /// <summary> /// Write debug message to log /// </summary> /// <param name="text">The debug text to log</param> public void Debug(string text) { WriteMessage(text, "DEBUG"); } /// <summary> /// Write debug message to log /// </summary> /// <param name="text">The trace text to log</param> public void Trace(string text) { WriteMessage(text, "TRACE"); } /// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> /// <filterpriority>2</filterpriority> public void Dispose() { lock (_lock) { if (_writer.IsValueCreated) { _writer.Value.Dispose(); } } } /// <summary> /// Writes the message to the writer /// </summary> private void WriteMessage(string text, string level) { lock (_lock) { //_writer.Value.WriteLine("{0} {1}:: {2}", DateTime.UtcNow.ToString("o"), level, text); _writer.Value.WriteLine("{0}", text); _writer.Value.Flush(); } } } } */