| 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 |
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using QuantConnect.Securities.Option;
namespace QuantConnect
{
public partial class QCUMartingalePositionSizing : QCAlgorithm
{
const string iSymbol = "SPY";
DateTime iTime;
Option iOptionSource;
Symbol iOptionSymbol;
public override void Initialize()
{
SetCash(10000);
SetStartDate(DateTime.Now.Date.AddDays(-15));
SetEndDate(DateTime.Now.Date);
SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);
iOptionSource = AddOption(iSymbol, Resolution.Minute, Market.USA, true);
iOptionSymbol = iOptionSource.Symbol;
iOptionSource.SetFilter(u => u
.IncludeWeeklys()
//.Strikes(-2, +2)
//.Expiration(TimeSpan.Zero, TimeSpan.FromDays(7))
//.Where(o => Math.Abs(u.Underlying.Price - o.ID.StrikePrice) < 50)
);
}
public override void OnData(Slice slice)
{
if (IsNewBar(TimeSpan.FromHours(1)) == false)
{
return;
}
if (IsMarketOpen(iSymbol) == false)
{
return;
}
if (Portfolio[iSymbol].Invested)
{
MarketOrder(iSymbol, -100);
}
if (Portfolio.Invested == false)
{
OptionChain chain;
if (slice.OptionChains.TryGetValue(iOptionSymbol, out chain))
{
var date = iOptionSource.Underlying.LocalTime;
var price = iOptionSource.Underlying.Price;
Debug(
chain.FirstOrDefault().Symbol + " : " +
chain.LastOrDefault().Symbol
);
var otmCalls = chain
.Where(o => o.Right == OptionRight.Call)
.Where(o => o.Strike - price < 5 && o.Strike - price > 2)
.OrderBy(o => o.Expiry)
.ThenByDescending(o => o.Strike - price);
var otmPuts = chain
.Where(o => o.Right == OptionRight.Put)
.Where(o => price - o.Strike < 5 && price - o.Strike > 2)
.OrderBy(o => o.Expiry)
.ThenByDescending(o => price - o.Strike);
var contractCall = otmCalls.FirstOrDefault();
var contractPut = otmPuts.FirstOrDefault();
if (contractCall != null)
{
MarketOrder(contractCall.Symbol, -1);
}
if (contractPut != null)
{
MarketOrder(contractPut.Symbol, -1);
}
}
}
}
public bool IsNewBar(TimeSpan interval, int points = 1)
{
var date = Securities[iSymbol].LocalTime;
if ((date - iTime).TotalSeconds > interval.TotalSeconds * points)
{
iTime = new DateTime(date.Ticks - date.Ticks % interval.Ticks, date.Kind);
return true;
}
return false;
}
}
}