| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -2.379 Tracking Error 0.147 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
using System;
using System.Drawing;
namespace QuantConnect.Algorithm.CSharp
{
public class CasualYellowGreenLemur : QCAlgorithm
{
private DateTime _previous;
private Symbol _chainSymbol;
private Symbol _contractSymbol;
private const decimal StopLossPercent = 0.01m;
private const decimal TakeProfitPercent = 0.04m;
private const decimal tolerance = 0.00015m;
private int quantity = 1000;
private decimal price = 0.0m;
private OrderTicket CurrentOrder;
private List<OrderTicket> StopLoss = new List<OrderTicket>();
private List<OrderTicket> ProfitTarget = new List<OrderTicket>();
private Dictionary<Symbol, ExponentialMovingAverage> fast = new Dictionary<Symbol, ExponentialMovingAverage>();
private Dictionary<Symbol, ExponentialMovingAverage> slow = new Dictionary<Symbol, ExponentialMovingAverage>();
public override void Initialize()
{
SetStartDate(2021, 3, 1);
SetEndDate(2021, 3, 16);
SetCash(100000);
var future = AddFuture(Futures.Indices.NASDAQ100EMini);
future.SetFilter(0, 182);
_chainSymbol = future.Symbol;
}
public void OnData(Slice slice) {
if (_previous.Date == Time.Date) return;
FuturesChain chain;
// Find the contracts in the FuturesChain
// See docs: https://www.quantconnect.com/docs/data-library/futures
if (slice.FuturesChains.TryGetValue(_chainSymbol, out chain))
{
var underlying = chain.Underlying;
foreach (var contract in chain)
{
// Create indicators for each contract and save them in dictionaries keyed by Symbol
var symbol = contract.Symbol;
if (!slow.ContainsKey(symbol))
{
slow[symbol] = EMA(symbol, 89, Resolution.Minute);
}
if (!fast.ContainsKey(symbol))
{
fast[symbol] = EMA(symbol, 72, Resolution.Minute);
}
}
// For example, select the contract with the earliest expiry
_contractSymbol = (
from futuresContract in chain.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Time.Date.AddDays(90)
select futuresContract
).FirstOrDefault()?.Symbol;
}
if (_contractSymbol == null)
{
return;
}
var holdings = Portfolio[_contractSymbol].Quantity;
var profitloss = Portfolio[_contractSymbol].UnrealizedProfit;
// we only want to go long if we're currently short or flat
// if the fast is greater than the slow, we'll go long
// the fast for the selected contract is found in the dictionary
if (holdings == 0 )
{
var f= fast[_contractSymbol] *1;
var s = slow[_contractSymbol]* (1 + tolerance);
// if the slow is greater than the fast, we'll go long
if (fast[_contractSymbol] > (slow[_contractSymbol] * (1 + tolerance)))
{
var stopLossPrice = Securities[_chainSymbol].Price - StopLossPercent * Securities[_chainSymbol].Price;
var t = price;
var q = quantity;
var y = StopLossPercent * Securities[_chainSymbol].Price;
StopLoss.Add(StopMarketOrder(_chainSymbol, -1* quantity, stopLossPrice));
// var orderId= StopLoss;
// Set Profit Target
var profitTargetPrice = Securities[_chainSymbol].Price + TakeProfitPercent * Securities[_chainSymbol].Price;
ProfitTarget.Add(LimitOrder(_chainSymbol, quantity, profitTargetPrice));
Log("BUY >> " + Securities[_chainSymbol].Price + " Our stopLossPrice: " + stopLossPrice + " ProfitTarget: " + profitTargetPrice+ " Quantity: " + quantity);
var p = ProfitTarget[ProfitTarget.Count()-1].OrderId;
var s1 = StopLoss[StopLoss.Count()-1].OrderId;
Log("StopLoss OrderId = "+ StopLoss[StopLoss.Count()-1].OrderId + " ProfitTarget OrderId = "+ ProfitTarget[ProfitTarget.Count()-1].OrderId);
SetHoldings(_chainSymbol, 0.50);
}
}
if (holdings > 0)//if (holdings > 0 && fast <= slow)
{
//Log("SELL >> " + Securities[Symbol].Price + " Our price: " + price + " Quantity: " + quantity);
var stopLossPrice = Securities[_chainSymbol].Price - StopLossPercent * Securities[_chainSymbol].Price;
Liquidate(_chainSymbol);
var close = Securities[_chainSymbol].Close;
/// var stopMarketTicket = StopMarketOrder(Symbol, 10, close * 0.99m);
StopLoss.Add(StopMarketOrder(_chainSymbol, quantity, stopLossPrice));
// Set Profit Target
var profitTargetPrice = Securities[_chainSymbol].Price + TakeProfitPercent * Securities[_chainSymbol].Price;
ProfitTarget.Add(LimitOrder(_chainSymbol, quantity, profitTargetPrice));
Log("SELL >> " + Securities[_chainSymbol].Price + " Our stopLossPrice: " + stopLossPrice + " ProfitTarget: " + profitTargetPrice+ " Quantity: " + quantity);
Log("StopLoss OrderId = "+ StopLoss[StopLoss.Count()-1].OrderId + " ProfitTarget OrderId = "+ ProfitTarget[ProfitTarget.Count()-1].OrderId);
}
Plot(_chainSymbol, "Price", Securities[_chainSymbol].Price);
// easily plot indicators, the series name will be the name of the indicator
// Plot(Symbol, "Slow", slow);
//Plot(Symbol, "fast", fast);
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
// Ignore OrderEvents that are not closed
if (!orderEvent.Status.IsClosed())
{
return;
}
var t = ProfitTarget.Count();
var s = StopLoss;
// Defensive check
if (ProfitTarget.Count() == 0 || StopLoss.Count() == 0)
{
return;
}
var filledOrderId = orderEvent.OrderId;
var x=0;
// If the ProfitTarget order was filled, close the StopLoss order
foreach(var profitTarget in ProfitTarget)
{
if (profitTarget.OrderId == filledOrderId)
{
Log("StopLoss.Cancel OrderId = " + StopLoss[x].OrderId);
StopLoss[x].Cancel();
}
++x ;
}
// If the StopLoss order was filled, close the ProfitTarget
x=0;
foreach(var stopLoss in StopLoss)
{
if (stopLoss.OrderId == filledOrderId)
{
Log("ProfitTarget.Cancel OrderId = " + ProfitTarget[x].OrderId);
ProfitTarget[x].Cancel();
}
++x ;
}
}
//Plot(_contractSymbol, "Price", slice[_contractSymbol].Price);
//Plot(_contractSymbol, _fast[_contractSymbol], _slow[_contractSymbol]);
}
}