/*
* 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 System;
using System.Globalization;
using Newtonsoft.Json;
using QuantConnect.Securities;
using QuantConnect.Util;
namespace QuantConnect.Packets
{
///
/// Algorithm backtest task information packet.
///
public class BacktestNodePacket : AlgorithmNodePacket
{
// default random id, static so its one per process
private static readonly string DefaultId
= Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture);
///
/// Name of the backtest as randomly defined in the IDE.
///
public string Name { get; set; } = string.Empty;
///
/// BacktestId / Algorithm Id for this task
///
public string BacktestId { get; set; } = DefaultId;
///
/// Optimization Id for this task
///
public string OptimizationId { get; set; }
///
/// Backtest start-date as defined in the Initialize() method.
///
public DateTime? PeriodStart { get; set; }
///
/// Backtest end date as defined in the Initialize() method.
///
public DateTime? PeriodFinish { get; set; }
///
/// Backtest maximum end date
///
public DateTime? OutOfSampleMaxEndDate { get; set; }
///
/// The backtest out of sample day count
///
public int OutOfSampleDays { get; set; }
///
/// Estimated number of trading days in this backtest task based on the start-end dates.
///
public int TradeableDates { get; set; }
///
/// True, if this is a debugging backtest
///
public bool Debugging { get; set; }
///
/// Optional initial cash amount if set
///
public CashAmount? CashAmount { get; set; }
///
/// Algorithm running mode.
///
[JsonIgnore]
public override AlgorithmMode AlgorithmMode
{
get
{
return OptimizationId.IsNullOrEmpty() ? AlgorithmMode.Backtesting : AlgorithmMode.Optimization;
}
}
///
/// Default constructor for JSON
///
public BacktestNodePacket()
: base(PacketType.BacktestNode)
{
Controls = new Controls
{
MinuteLimit = 500,
SecondLimit = 100,
TickLimit = 30
};
}
///
/// Initialize the backtest task packet.
///
public BacktestNodePacket(int userId, int projectId, string sessionId, byte[] algorithmData, decimal startingCapital, string name)
: this (userId, projectId, sessionId, algorithmData, name, new CashAmount(startingCapital, Currencies.USD))
{
}
///
/// Initialize the backtest task packet.
///
public BacktestNodePacket(int userId, int projectId, string sessionId, byte[] algorithmData, string name, CashAmount? startingCapital = null)
: base(PacketType.BacktestNode)
{
UserId = userId;
Algorithm = algorithmData;
SessionId = sessionId;
ProjectId = projectId;
Name = name;
CashAmount = startingCapital;
Language = Language.CSharp;
Controls = new Controls
{
MinuteLimit = 500,
SecondLimit = 100,
TickLimit = 30
};
}
}
}