| Overall Statistics |
|
Total Trades 73 Average Win 0.12% Average Loss -0.07% Compounding Annual Return -0.343% Drawdown 1.000% Expectancy -0.260 Net Profit -0.315% Sharpe Ratio -0.535 Loss Rate 72% Win Rate 28% Profit-Loss Ratio 1.66 Alpha -0.002 Beta -0.006 Annual Standard Deviation 0.005 Annual Variance 0 Information Ratio -2.464 Tracking Error 0.062 Treynor Ratio 0.497 Total Fees $73.00 |
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
namespace QuantConnect
{
public partial class QCUMartingalePositionSizing : QCAlgorithm
{
[Parameter]
public decimal iStopPips = 5m;
[Parameter]
public decimal iVolume = 1m;
[Parameter]
public decimal iCommission = 1m;
[Parameter]
public string iSymbol = "PEP";
decimal iVolumeStep = 0;
decimal iBalanceStep = 0;
decimal iBalance = 10000m;
string iChartName = "Deals";
int iDirection = 0;
public class iDeal
{
public int SL;
public int TP;
public int Market;
};
Dictionary<int, iDeal> iDeals = new Dictionary<int, iDeal>();
public override void Initialize()
{
var resolution = Resolution.Minute;
SetCash(iBalance);
//SetStartDate(2008, 1, 1);
//SetEndDate(2009, 12, 1);
SetStartDate(2017, 1, 1);
SetEndDate(DateTime.Now.Date);
SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);
AddSecurity(SecurityType.Equity, iSymbol, resolution, true, 4m, false);
var chart = new Chart(iChartName);
var seriesStock = new Series("Stock", SeriesType.Line, 0) { Color = Color.Gray };
var seriesBuy = new Series("Buy", SeriesType.Scatter, 0) { Color = Color.Blue, ScatterMarkerSymbol = ScatterMarkerSymbol.Triangle };
var seriesSell = new Series("Sell", SeriesType.Scatter, 0) { Color = Color.Red, ScatterMarkerSymbol = ScatterMarkerSymbol.TriangleDown };
var seriesBalance = new Series("Balance", SeriesType.Line, 1) { Color = Color.Yellow };
chart.AddSeries(seriesStock);
chart.AddSeries(seriesBuy);
chart.AddSeries(seriesSell);
chart.AddSeries(seriesBalance);
iDirection = 1;
iVolumeStep = iVolume;
iBalanceStep = GetBalance();
AddChart(chart);
}
public void OnData(TradeBars data)
{
if (IsMarketOpen(iSymbol) == false)
{
return;
}
Plot(iChartName, "Stock", data[iSymbol].Price);
Plot(iChartName, "Balance", iBalance);
var direction = CanOpen();
if (direction > 0)
{
Plot(iChartName, "Buy", Securities[iSymbol].Price);
Action(iSymbol, iVolumeStep, 1);
return;
}
if (direction < 0)
{
Plot(iChartName, "Sell", Securities[iSymbol].Price);
Action(iSymbol, iVolumeStep, -1);
return;
}
CanClose();
}
protected OrderTicket Action(string symbol, decimal volume, int direction)
{
var ticket = MarketOrder(symbol, volume * direction, false, "MK");
iDeals[ticket.OrderId] = new iDeal { Market = ticket.OrderId };
var process = new Thread(() => {
Transactions.WaitForOrder(ticket.OrderId);
if (Transactions.GetOrderById(ticket.OrderId).Status != OrderStatus.Filled)
{
return;
}
var price = Securities[symbol].Price;
var orderSL = StopMarketOrder(symbol, -volume * direction, price - iStopPips * direction, "SL #" + ticket.OrderId.ToString());
//var orderTP = LimitOrder(symbol, -volume * direction, price + iStopPips * 3 * direction, "TP #" + ticket.OrderId.ToString());
iDeals[ticket.OrderId].SL = orderSL.OrderId;
//iDeals[ticket.OrderId].TP = orderTP.OrderId;
});
process.Start();
return ticket;
}
protected int CanOpen()
{
if (Portfolio.Invested == false)
{
var balance = GetBalance();
if (balance < iBalanceStep)
{
iVolumeStep = iVolumeStep * 2;
iDirection = iDirection * -1;
}
else
{
Plot(iChartName, "Balance", balance);
iBalanceStep = balance;
iVolumeStep = iVolume;
}
return iDirection;
}
return 0;
}
protected int CanClose()
{
var balance = GetBalance() - iCommission * 2;
if (Portfolio.Invested && balance > iBalanceStep)
{
Liquidate();
return 1;
}
return 0;
}
protected decimal GetBalance()
{
return iBalance +
Portfolio.TotalUnrealizedProfit +
Portfolio.TotalProfit -
Portfolio.TotalFees;
}
}
}