| Overall Statistics |
|
Total Trades 382 Average Win 8.31% Average Loss -2.75% Compounding Annual Return 43.747% Drawdown 35.200% Expectancy 0.620 Net Profit 1436.849% Sharpe Ratio 1.096 Probabilistic Sharpe Ratio 41.913% Loss Rate 60% Win Rate 40% Profit-Loss Ratio 3.02 Alpha 0.161 Beta 0.265 Annual Standard Deviation 0.319 Annual Variance 0.102 Information Ratio -0.688 Tracking Error 0.53 Treynor Ratio 1.323 Total Fees $329455.99 Estimated Strategy Capacity $600000.00 Lowest Capacity Asset BTCUSD E3 |
namespace QuantConnect
{
public class CreativeFluorescentOrangeMosquito : QCAlgorithm
{
private OrderTicket orderTicket;
private decimal stoploss = 0m;
private string ticker = "BTCUSD";
public decimal price;
public decimal usd;
int fastPeriod = 50;
int mediumPeriod = 120;
int slowPeriod = 200;
ExponentialMovingAverage fastMA;
ExponentialMovingAverage mediumMA;
ExponentialMovingAverage slowMA;
RelativeStrengthIndex rsi;
public override void Initialize()
{
SetTimeZone("Etc/GMT");
SetStartDate(2014, 01, 01);
SetBrokerageModel(BrokerageName.Bitfinex, AccountType.Cash);
SetCash(100000);
var _crypto = AddCrypto(ticker, Resolution.Hour, Market.Bitfinex);
fastMA = EMA(ticker, fastPeriod, Resolution.Hour);
mediumMA = EMA(ticker, mediumPeriod, Resolution.Hour);
slowMA = EMA(ticker, slowPeriod, Resolution.Hour);
rsi = RSI(ticker, 14, MovingAverageType.Wilders, Resolution.Hour);
SetBenchmark(ticker);
SetWarmUp(200);
}
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// Slice object keyed by symbol containing the stock data
public override void OnData(Slice data)
{
//if (!Portfolio.Invested )
//{
// SetHoldings(ticker, 1);
//}
//return;
if (!slowMA.IsReady)
{
return;
}
price = data[ticker].Price;
stoploss = Math.Round(mediumMA.Current.Value * 0.995m, 2);
//usd = Portfolio.CashBook["USD"].Amount * 0.98m;
//usd = Portfolio.GetBuyingPower("USD", 0);
//var holdings = Portfolio[ticker].Quantity;
//Log(Portfolio.GetBuyingPower("USD", 0));
//var fastMaVal = fastMA.Current.Value;
//var distancePerc = ((price - fastMaVal) / fastMaVal) * 100;
if (!Portfolio.Invested)
{
//&& rsi.Current.Value >= 70
if (fastMA > mediumMA && mediumMA > slowMA && rsi.Current.Value >= 70)
{
var usdHeld = Portfolio.CashBook["USD"].Amount;
var quantity = (usdHeld / price) * 0.95m;
MarketOrder(ticker, quantity);
//SetHoldings(ticker, 0.95);
}
}
else
{
if (orderTicket.Status != OrderStatus.Filled)
{
orderTicket.UpdateStopPrice(stoploss);
}
//if (fastMA < mediumMA)
//{
// Liquidate();
//}
}
Plot("Candles", "Open", data.Bars[ticker].Open);
Plot("Candles", "High", data.Bars[ticker].High);
Plot("Candles", "Low", data.Bars[ticker].Low);
Plot("Candles", "Close", data.Bars[ticker].Close);
Plot("ChartIndicators", "FastMA", fastMA);
Plot("ChartIndicators", "MediumMA", mediumMA);
Plot("ChartIndicators", "SlowMA", slowMA);
Plot("ChartIndicators", "StopLoss", stoploss);
Plot("Info", "TotalHoldingsValue", Portfolio.TotalHoldingsValue);
Plot("Info", "TotalPortfolioValue", Portfolio.TotalPortfolioValue);
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
if (orderEvent.Status.IsFill())
{
if (orderEvent.FillQuantity > 0)
{
orderTicket = StopMarketOrder(ticker, -orderEvent.FillQuantity, stoploss);
}
//Debug($"Purchased Stock: {orderEvent.Symbol}");
}
}
}
}