Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio NaN Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio NaN Tracking Error NaN Treynor Ratio NaN Total Fees $0.00 |
namespace QuantConnect { /* * QuantConnect University: Consolidators - Creating custom timespan events. * * Consolidators are tools inside of LEAN to merge data into single bars. They are * very flexible and can generate events which trigger from any timespan. */ public class ConsolidatorAlgorithm : QCAlgorithm { int _stopMarketOrderId = 0; StopMarketOrder _stopMarketOrder; public SimpleMovingAverage SMA_Fast; public SimpleMovingAverage SMA_Slow; string symbol = "EURGBP"; public override void Initialize() { SetStartDate(2009, 1, 1); SetEndDate(2014, 1, 1); SetCash(25000); AddSecurity(SecurityType.Forex, symbol, Resolution.Minute); // define our SMAs SMA_Fast = SMA(symbol, 60, Resolution.Minute); SMA_Slow = SMA(symbol, 600, Resolution.Minute); } bool crossLong = false; bool crossShort = false; decimal breakoutLong = new decimal(); decimal breakoutShort = new decimal(); int quantity = 1000; /// <summary> /// This is our event handler for our daily trade bar defined above in Initialize(). So each time the consolidator /// produces a new daily bar, this function will be called automatically. The 'sender' parameter will be the /// instance of the IDataConsolidator that invoked the event, but you'll almost never need that! /// </summary> //Create the first order public void OnData(TradeBars data) { if (!SMA_Slow.IsReady) return; Log("Current position is: " + Portfolio[symbol].Quantity); //first order set stopmMarket order @ high of tradebar if (_stopMarketOrderId == 0) { _stopMarketOrderId = StopMarketOrder(symbol, quantity, data[symbol].High + .0001m); _stopMarketOrder = (StopMarketOrder)Transactions.GetOrderById(_stopMarketOrderId); } //if fast moving average > slow, we are bullish if (SMA_Fast > SMA_Slow) { //reset crossShort variable so next time we cross back to bearish we know we have just crossed crossShort = false; //if we are short, liquidate short position if (Portfolio[symbol].Quantity < 0) { Log("Liqudiating" + Portfolio[symbol].Quantity + " of " + symbol); Order(symbol, -Portfolio[symbol].Quantity); } //if first trade bar going from bearish to bullish, update stopMarket order to buy at market when price is at if (crossLong == false) { // set crossLong variable to true so that this block will only execute on the first bar going from bearish to bullish crossLong = true; Log("Going to go long if price is above " + data[symbol].High + " + .0001"); _stopMarketOrder.StopPrice = data[symbol].High + .0001m; _stopMarketOrder.Quantity = quantity; Log("Setting stop limit order at:" + data[symbol].High + " + .0001"); Transactions.UpdateOrder(_stopMarketOrder); } else if (crossLong == true) { Log("Current position is " + Portfolio[symbol].Quantity + " and current StopMarket order is " + _stopMarketOrder.Quantity + " @ price:" + _stopMarketOrder.StopPrice); } } // case if bearish if (SMA_Fast < SMA_Slow) { //reset bullish counter crossLong = false; //liquidate an long positions if (Portfolio[symbol].Quantity > 0) { Log("Liqudiating " + Portfolio[symbol].Quantity + " of " + symbol); Order(symbol,-Portfolio[symbol].Quantity); } //if first trade bar after going from bullish to bearish if (crossShort == false) { //change counter variable so this code will not execute until next time we cross bearish crossShort = true; Log("Going to go short if price is below " + data[symbol].Low + " - .0001"); _stopMarketOrder.StopPrice = data[symbol].Low - .0001m; _stopMarketOrder.Quantity = -quantity; Log("Setting stop limit order short at:" + data[symbol].Low + " - .0001"); Transactions.UpdateOrder(_stopMarketOrder); } else if (crossShort == true) { Log("Current position is " + Portfolio[symbol].Quantity + " and current StopMarket order is " + _stopMarketOrder.Quantity + " @ price:" + _stopMarketOrder.StopPrice); } } } } }