| Overall Statistics |
|
Total Trades 5 Average Win 0% Average Loss -0.42% Compounding Annual Return -0.936% Drawdown 2.900% Expectancy -1 Net Profit -1.790% Sharpe Ratio -0.399 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.01 Beta -0.033 Annual Standard Deviation 0.019 Annual Variance 0 Information Ratio 0.194 Tracking Error 0.318 Treynor Ratio 0.226 Total Fees $5.00 |
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
namespace QuantConnect
{
public partial class DailyMartin : 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";
public class iDeal
{
public int SL;
public int TP;
public int Price;
public int Direction;
};
Dictionary<int, iDeal> iDeals = new Dictionary<int, iDeal>();
public override void Initialize()
{
var resolution = Resolution.Daily;
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);
iVolumeStep = iVolume;
iBalanceStep = GetBalance();
AddChart(chart);
}
public override void OnOrderEvent(OrderEvent data)
{
var order = Transactions.GetOrderById(data.OrderId);
if (order.Status == OrderStatus.Filled)
{
Log("FILL " + data.OrderId + " : " + order.Tag);
if (order.Tag == "TM" || order.Tag == "BM")
{
Transactions.CancelOpenOrders(iSymbol);
var price = Securities[iSymbol].Price;
var direction = order.Direction == OrderDirection.Buy ? 1 : -1;
var SL = StopMarketOrder(iSymbol, iVolumeStep * direction * -1, price - iStopPips * direction, "SL");
var TP = LimitOrder(iSymbol, iVolumeStep * direction * -1, price + 2 * iStopPips * direction, "TP");
}
if (order.Tag == "SL" || order.Tag == "TP")
{
Transactions.CancelOpenOrders(iSymbol);
}
}
}
public void OnData(TradeBars data)
{
Plot(iChartName, "Stock", data[iSymbol].Price);
Plot(iChartName, "Balance", iBalanceStep);
var setup = CanOpen();
if (setup == 1)
{
var buy = StopMarketOrder(iSymbol, iVolume, Securities[iSymbol].Price + 1, "TM");
var sell = StopMarketOrder(iSymbol, -iVolume, Securities[iSymbol].Price - 1, "BM");
Log("SAVE " + buy.OrderId + " : " + sell.OrderId);
iDeals[buy.OrderId] = new iDeal { Price = buy.OrderId, Direction = 1 };
iDeals[sell.OrderId] = new iDeal { Price = sell.OrderId, Direction = -1 };
}
}
protected int CanOpen()
{
if (Portfolio.Invested == false && Transactions.GetOpenOrders(iSymbol).Count == 0)
{
var balance = GetBalance();
if (balance < iBalanceStep)
{
iVolumeStep = iVolumeStep * 2;
}
else
{
Plot(iChartName, "Balance", balance);
iBalanceStep = balance;
iVolumeStep = iVolume;
}
return 1;
}
return 0;
}
protected decimal GetBalance()
{
var balance = iBalance +
Portfolio.TotalUnrealizedProfit +
Portfolio.TotalProfit -
Portfolio.TotalFees;
return balance;
}
}
}