| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 5.428% Drawdown 0.200% Expectancy 0 Net Profit 0% Sharpe Ratio 4.35 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0.009 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
namespace QuantConnect
{
/// <summary>
/// QCU: Derivative Tradeable Securities
///
/// This algorithm shows how to define a security that derives from tradebar data
///
/// </summary>
public class DerivedSecurityAlgorithm : QCAlgorithm
{
public override void Initialize()
{
SetStartDate(2013, 10, 07);
SetEndDate(2013, 11, 07);
// add our custom data
AddData<PutOption>("SPY.PUT", Resolution.Minute);
// we need to set the exchange hours properly
Securities["SPY.PUT"].Exchange = new EquityExchange();
}
public override void OnData(Slice slice)
{
if (Transactions.OrdersCount == 0)
{
// we can order our custom data like any other
SetHoldings("SPY.PUT", 0.1);
}
}
}
}namespace QuantConnect {
/// <summary>
/// This is our custom derived security type. It produces a security whose value
/// is equal to:
///
/// Value = underlying.Close + Math.Abs((C - O) * (H - L))
/// </summary>
public class PutOption : BaseData
{
// define derived properties
public decimal DerivedProperty1 { get; set; }
public decimal DerivedProperty2 { get; set; }
// override so we can properly set it from the tradebar
public override DateTime EndTime { get; set; }
/// <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>
/// <param name="config">Subscription data config setup object</param>
/// <param name="line">Line of the source document</param>
/// <param name="date">Date of the requested data</param>
/// <param name="isLiveMode">true if we're in live mode, false for backtesting mode</param>
/// <returns>Instance of the T:BaseData object generated by this line of the CSV</returns>
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLiveMode)
{
try
{
config = HackSubscriptionDataConfig(config);
// use the tradebar reader implementation to read QC csv files
var tradebar = (TradeBar)new TradeBar().Reader(config, line, date, isLiveMode);
// now that we have the tradebar for our underlying, we can do some math
// here I just did something random to show the possibilities.
return new PutOption
{
// symbol, time, and endtime are required values. the end time is used for time syncing the data
Symbol = config.Symbol + ".PUT",
Time = tradebar.Time,
EndTime = tradebar.EndTime,
// we can compute derived properties from the tradebar
DerivedProperty1 = tradebar.High - tradebar.Low,
DerivedProperty2 = tradebar.Close - tradebar.Open,
// value must resolve to greater than zero to be 'tradeable' in QC backtests
Value = tradebar.Close + (tradebar.Close - tradebar.Open) * (tradebar.High - tradebar.Low),
};
}
catch
{
return null;
}
}
/// <summary>
/// Return the URL string source of the file. This will be converted to a stream
/// </summary>
/// <param name="config">Configuration object</param>
/// <param name="date">Date of this source file</param>
/// <param name="isLiveMode">true if we're in live mode, false for backtesting mode</param>
/// <returns>String URL of source file.</returns>
public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLiveMode)
{
// the source of our data is the same as normal trade bar data
config = HackSubscriptionDataConfig(config);
return new TradeBar().GetSource(config, date, isLiveMode);
}
/// <summary>
/// Reroutes the configuration to an equity trade bar
/// </summary>
private static SubscriptionDataConfig HackSubscriptionDataConfig(SubscriptionDataConfig config)
{
// we need to override the configuration produced by the AddData method so it will get the
// data from the same place we get equity tradebar equity data
config = new SubscriptionDataConfig(typeof(TradeBar), SecurityType.Equity,
// we replace the .PUT from the symbol.
config.Symbol.Value.Replace(".PUT", string.Empty),
// reuse all the other options so we get the right data
config.Resolution, config.Market, config.TimeZone, config.FillDataForward,
config.ExtendedMarketHours, config.IsInternalFeed, config.IsCustomData
);
return config;
}
}
}