Overall Statistics |
Total Trades 1 Average Win 0% Average Loss -0.02% Compounding Annual Return -0.023% Drawdown 0.000% Expectancy -1 Net Profit -0.016% Sharpe Ratio -1.033 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -2.232 Tracking Error 0.1 Treynor Ratio 0.404 Total Fees $4.00 |
namespace QuantConnect { /* * QuantConnect University - Creating and Updating Limit Orders * * This algorithm walks through an example of creating and updating a limit order. * The orders are stored in the Transactions Manager inside the algorithm. * * For the demonstration we will place a buy limit order for 1 SD below of microsoft's price, * and every day update it until its filled */ public class QCULimitOrders : QCAlgorithm { //Access for the order we'll place int _limitOrderId = 0; LimitOrder _limitOrder; string _symbol = "GBPUSD"; decimal _price = 0; public SimpleMovingAverage SMA_Fast; public SimpleMovingAverage SMA_Slow; string direction = "bullish"; bool crossover = false; int quantity = 1000; //Initialize the data and resolution you require for your strategy: public override void Initialize() { SetStartDate(2013, 1, 1); SetEndDate(DateTime.Now.Date.AddDays(-1)); SetCash(25000); AddSecurity(SecurityType.Forex, _symbol, Resolution.Minute); SMA_Fast = SMA(_symbol, 60, Resolution.Minute); SMA_Slow = SMA(_symbol, 600, Resolution.Minute); } //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol. public void OnData(TradeBars data) { //if (data.Contains("MSFT")) _price = data[_symbol].Close; //Create the first order if (_limitOrderId == 0) { //Set our first order to less than MS's price: _limitOrderId = LimitOrder(_symbol, (int)(Portfolio.Cash/_price), (_price * 0.95m)); _limitOrder = (LimitOrder)Transactions.GetOrderById(_limitOrderId); Debug("Created first limit order with " + _symbol + " Price: " + _price.ToString("C") + " id: " + _limitOrderId); } if(!SMA_Slow.IsReady) return; if ((SMA_Fast > SMA_Slow && direction == "bearish") || (SMA_Fast < SMA_Slow && direction == "bullish")) { crossover = true; Log("it is a crossover"); } else { Log("not a crossover; direction from last time is " + direction + " and SMA_Fast is " + SMA_Fast + " while SMA_Slow is " + SMA_Slow); } if (SMA_Fast > SMA_Slow) { direction = "bullish"; } else { direction = "bearish"; } //Update the limit price once per week: if (crossover == true) { // liquidate current position on crossover Order(_symbol, -Portfolio[_symbol].Quantity); // update limit order based on whether bearish or bullish if (direction == "bullish") { _limitOrder.Price = data[_symbol].High + .0001m; _limitOrder.Quantity = quantity; Transactions.UpdateOrder(_limitOrder); } else if (direction == "bearish") { _limitOrder.Price = data[_symbol].Low - .0001m; _limitOrder.Quantity = -quantity; Transactions.UpdateOrder(_limitOrder); } else { Log("some kind of error"); } } } /* * For our plotting we can show the limit price and MSFT to check if its hit. */ public override void OnEndOfDay() { Plot("Limit Plot", _symbol, _price); Plot("Limit Plot", "Limit", _limitOrder.LimitPrice); } } }