| Overall Statistics |
|
Total Trades 347 Average Win 10.05% Average Loss 0% Compounding Annual Return 986.049% Drawdown 7.400% Expectancy 0 Net Profit 45.805% Sharpe Ratio 10.019 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.316 Beta 0.616 Annual Standard Deviation 0.229 Annual Variance 0.053 Information Ratio -5.06 Tracking Error 0.181 Treynor Ratio 3.729 Total Fees $359.40 |
using System.Threading;
using System.Threading.Tasks;
namespace QuantConnect
{
public partial class QCUMartingalePositionSizing : QCAlgorithm
{
[Parameter]
public int iPeriod = 15;
[Parameter]
public decimal iIncomePercents = 0.1m;
[Parameter]
public decimal iStopPips = 5m;
[Parameter]
public decimal iVolume = 10m;
[Parameter]
public decimal iBalance = 10000m;
[Parameter]
public string iSymbol = "SQ";
decimal iRsiStep = 0;
RelativeStrengthIndex iRsi = null;
public class iDeal
{
public int SL;
public int TP;
public int Market;
};
Dictionary<int, iDeal> iDeals = new Dictionary<int, iDeal>();
public override void Initialize()
{
SetCash(iBalance);
SetBenchmark(iSymbol);
SetStartDate(2017, 10, 1);
SetEndDate(DateTime.Now.Date);
SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage);
AddSecurity(SecurityType.Equity, iSymbol, Resolution.Minute, true, 4m, false);
iRsi = RSI(iSymbol, iPeriod, MovingAverageType.Simple, Resolution.Minute);
var chart = new Chart("Custom Chart");
var seriesStock = new Series("Stock", SeriesType.Line, 0);
var seriesBuy = new Series("Buy", SeriesType.Scatter, 0);
var seriesSell = new Series("Sell", SeriesType.Scatter, 0);
var seriesBalance = new Series("Balance", SeriesType.Line, 1);
var seriesIndicator = new Series("RSI", SeriesType.Line, 2);
chart.AddSeries(seriesStock);
chart.AddSeries(seriesBuy);
chart.AddSeries(seriesSell);
chart.AddSeries(seriesBalance);
chart.AddSeries(seriesIndicator);
AddChart(chart);
}
public void OnData(TradeBars data)
{
if (iRsi.IsReady == false || IsMarketOpen(iSymbol) == false)
{
return;
}
Plot("Custom Chart", "Stock", data[iSymbol].Price);
Plot("Custom Chart", "Balance", iBalance);
Plot("Custom Chart", "RSI", iRsi);
if (CanOpen() == 1)
{
Action(iSymbol, iVolume, 1);
Plot("Custom Chart", "Buy", data[iSymbol].Price);
return;
}
if (CanClose() == 1)
{
Liquidate();
Plot("Custom Chart", "Sell", data[iSymbol].Price);
return;
}
}
protected OrderTicket Action(string symbol, decimal volume, int direction)
{
var ticket = MarketOrder(symbol, volume * direction, false);
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 + iIncomePips * 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 (iRsi.IsReady)
{
var previous = iRsiStep;
iRsiStep = iRsi;
if (iRsi < 70 && previous > 70)
{
return -1;
}
if (iRsi > 30 && previous < 30)
{
return 1;
}
}
return 0;
}
protected int CanClose()
{
var profit = Portfolio[iSymbol].UnrealizedProfit;
if (profit > iBalance * iIncomePercents)
{
iBalance += profit;
return 1;
}
return 0;
}
}
}