| 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 |
namespace QuantConnect
{
public partial class CoveredCallAlgorithm : QCAlgorithm
{
string lastProcessedDtm = string.Empty;
string lastTradeDtm = string.Empty;
Symbol _optionSymbolK;
Symbol _optionSymbolI;
// Manual add symbols required in your initialize method:
public override void Initialize() {
SetStartDate(2015, 8, 8);
SetEndDate(2015,9, 8);
var optionK = AddOption("QQQ", Resolution.Minute);
var optionI = AddOption("QQQQ", Resolution.Minute);
_optionSymbolK = optionK.Symbol;
_optionSymbolI = optionI.Symbol;
// set our strike/expiry filter for this option chain
optionK.SetFilter(-15, -2, TimeSpan.Zero, TimeSpan.FromDays(14));
optionI.SetFilter(-25, -2, TimeSpan.Zero, TimeSpan.FromDays(14));
}
// v3.0 Technique: Access data via grouped time slice method handlers:
public override void OnData(Slice slice) {
OptionChain chainK;
OptionChain chainI;
if(slice.OptionChains.TryGetValue(_optionSymbolK, out chainK) &&
slice.OptionChains.TryGetValue(_optionSymbolI, out chainI))
{
// find the second call strike under market price expiring today
var contractK = (
from optionContract in chainK.OrderBy(x=> x.Expiry).OrderByDescending(x => x.Strike)
where optionContract.Right == OptionRight.Put
where optionContract.Expiry > Time.Date
where optionContract.Strike < ( .97m * chainK.Underlying.Price)
select optionContract
).FirstOrDefault();
var contractI = (
from optionContract in chainI.OrderBy(x=> x.Expiry).OrderByDescending(x => x.Strike)
where optionContract.Right == OptionRight.Put
where optionContract.Expiry > Time.Date
where optionContract.Strike < ( .98m * chainI.Underlying.Price)
select optionContract
).FirstOrDefault();
if (contractK != null && contractI != null)
{
//SecurityHolding
if(slice.Time.DayOfWeek == DayOfWeek.Monday && lastTradeDtm != slice.Time.ToShortDateString())
{
var quantityK = CalculateOrderQuantity(contractK.Symbol, .25m);
MarketOrder(contractK.Symbol, quantityK);
Log(string.Format("traded {0} - {1}",
quantityK,
contractK.Symbol
));
var quantityI = CalculateOrderQuantity(contractI.Symbol, -.25m);
Log(string.Format("traded {0} - {1}",
quantityI,
contractI.Symbol
));
MarketOrder(contractI.Symbol, quantityI);
}
lastTradeDtm = slice.Time.ToShortDateString();
}else{
if( lastProcessedDtm != slice.Time.ToShortDateString() ){
Log("no contract");
}
}
}else{
if( lastProcessedDtm != slice.Time.ToShortDateString() ){
Log("no chain available");
}
}
lastProcessedDtm = slice.Time.ToShortDateString();
}
}
}