| Overall Statistics |
|
Total Trades 4 Average Win 0% Average Loss -5.43% Compounding Annual Return 18.196% Drawdown 14.100% Expectancy -1 Net Profit 5.745% Sharpe Ratio 0.695 Probabilistic Sharpe Ratio 41.068% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.205 Beta -0.049 Annual Standard Deviation 0.279 Annual Variance 0.078 Information Ratio -0.077 Tracking Error 0.585 Treynor Ratio -3.933 Total Fees $4.00 |
using System;
using System.Linq;
using QuantConnect.Indicators;
using QuantConnect.Models;
namespace QuantConnect.Algorithm.Examples
{
public class QCUMovingAverageCross : QCAlgorithm
{
private string _symbol = "SPY";
private decimal stoploss_pcnt =0.02m;
private decimal profittarget_pcnt =0.02m;
private Symbol symbol;
private Security sym;
private ExponentialMovingAverage ema;
private Chart _equityChart;
private DateTime previous;
private bool sl_set=false;
private bool is_above, is_below, is_above_last, is_below_last;
private decimal entryPrice;
private decimal highestPrice;
private OrderTicket StopLoss;
private DateTime StartDay = new DateTime(2020, 02, 29);
private DateTime EndDay = new DateTime(2020, 06, 29);
private int startCashAmount = 25000;
string chartName1 = "Chart_1";
public override void Initialize()
{
// set up our analysis span
SetStartDate(StartDay);
SetEndDate(EndDay);
SetCash(startCashAmount);
//SetBenchmark(time => 25000);
sym = AddSecurity(SecurityType.Equity, _symbol, Resolution.Daily);
symbol = sym.Symbol;
ema = EMA(symbol, 20, Resolution.Daily);
// chart underlying equity
_equityChart = new Chart(chartName1);
_equityChart.AddSeries(new Series("Plot_my2", SeriesType.Candle));
AddChart(_equityChart);
}
public void OnData(Slice data)
{
if (!ema.IsReady) return;
var holdings = Portfolio[symbol].Quantity;
decimal cash = Portfolio.Cash;
// only once per day
//if (previous.Date == Time.Date) return;
var X = Securities[symbol];
var close = X.Close;//price
is_above = close>ema;
is_below = close<ema;
var cross_above= is_above && !is_above_last;
var cross_below= is_below && !is_below_last;
// we only want to go long if we're currently short or flat
if (holdings <= 0 && cross_above )
{
Log("BUY >> " + Securities[symbol].Price);
SetHoldings(symbol, 1.0);
sl_set=false;
var quantity = CalculateOrderQuantity(_symbol, 1.0); // (int)Math.Floor(Portfolio.Cash / currentPrice);
//var ord=
MarketOrder(_symbol, quantity);
//entryPrice = ord.AverageFillPrice;
highestPrice=-99999.0m;
}
if (holdings > 0)
{
if (!sl_set)
{
sl_set=true;
StopLoss =
StopMarketOrder(symbol, -holdings, (1-stoploss_pcnt) *close);
//LimitOrder(symbol, -holdings, (1+profittarget_pcnt) *close);
}
if (false && cross_above)
{
Log("SELL >> " + close);
Liquidate(symbol);
}
//
if ( close > highestPrice)
{
highestPrice = close;
//StopLoss.Update(new UpdateOrderFields{ StopPrice = close * (1m - stoploss_pcnt) });
}
}
previous = Time; //data[_symbol].Time;
Plot(chartName1, "ema", ema);
Plot("others", "holdings", holdings);
// Candle
_equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(1), X.Open);
_equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(2), X.High);
_equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(3), X.Low);
_equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(4), X.Close);
is_above_last = is_above;
is_below_last = is_below;
}
}
}