| Overall Statistics |
|
Total Trades 24 Average Win 0.15% Average Loss 0% Compounding Annual Return 5.347% Drawdown 0.900% Expectancy 0 Net Profit 1.780% Sharpe Ratio 1.349 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.114 Beta -3.567 Annual Standard Deviation 0.036 Annual Variance 0.001 Information Ratio 0.84 Tracking Error 0.036 Treynor Ratio -0.014 Total Fees $3.00 |
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
namespace QuantConnect
{
public partial class QCUMartingalePositionSizing : QCAlgorithm
{
string iSymbol = "MSFT";
string iChart = "Deals";
DateTime iTime;
public override void Initialize()
{
SetCash(10000);
SetStartDate(2018, 1, 1);
SetEndDate(DateTime.Now.Date);
SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);
AddEquity(iSymbol, Resolution.Minute);
var chart = new Chart(iChart);
var seriesStock = new Series("Stock", SeriesType.Line, 0);
chart.AddSeries(seriesStock);
AddChart(chart);
}
public void OnData(TradeBars data)
{
if (IsMarketOpen(iSymbol) == false)
{
return;
}
if (IsNewBar(TimeSpan.FromHours(1)) == false)
{
return;
}
var price = Securities[iSymbol].Price;
Plot(iChart, "Stock", price);
if (Portfolio[iSymbol].Invested)
{
MarketOrder(iSymbol, -100);
}
if (Portfolio.Invested == false)
{
var contracts = OptionChainProvider.GetOptionContractList(iSymbol, Time);
var otmCalls =
from c in contracts
where c.ID.OptionRight == OptionRight.Call
where c.ID.StrikePrice - price < 5 && c.ID.StrikePrice - price > 1
where (c.ID.Date - Time).TotalDays < 35 && (c.ID.Date - Time).TotalDays > 0
select c;
var otmPuts =
from c in contracts
where c.ID.OptionRight == OptionRight.Put
where price - c.ID.StrikePrice < 5 && price - c.ID.StrikePrice > 1
where (c.ID.Date - Time).TotalDays < 35 && (c.ID.Date - Time).TotalDays > 0
select c;
var contractCall = otmCalls
.OrderBy(o => o.ID.Date)
.ThenByDescending(o => o.ID.StrikePrice - price)
.FirstOrDefault();
//Debug(Time + " : " + otmCalls.Count().ToString() + " : " + otmPuts.Count().ToString());
var contractPut = otmPuts
.OrderBy(o => o.ID.Date)
.ThenByDescending(o => price - o.ID.StrikePrice)
.FirstOrDefault();
if (contractCall != null)
{
AddOptionContract(contractCall, Resolution.Minute);
MarketOrder(contractCall, -1);
}
if (contractPut != null)
{
AddOptionContract(contractPut, Resolution.Minute);
MarketOrder(contractPut, -1);
}
}
}
protected decimal GetBalance(bool equity = false)
{
var balance = 0m;
if (equity)
{
balance += Portfolio.TotalUnrealizedProfit;
}
return
balance +
Portfolio.TotalProfit -
Portfolio.TotalFees;
}
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;
}
}
}