| Overall Statistics |
|
Total Trades 2 Average Win 0% Average Loss -0.03% Compounding Annual Return -2.443% Drawdown 0.000% Expectancy -1 Net Profit -0.034% Sharpe Ratio -6.481 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.015 Beta 0.009 Annual Standard Deviation 0.002 Annual Variance 0 Information Ratio -3.699 Tracking Error 0.025 Treynor Ratio -1.674 Total Fees $4.00 |
/*
* TODO dont reload data for first minutes if same contract?
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Brokerages;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using QuantConnect.Indicators;
using QuantConnect.Orders;
using QuantConnect.Securities;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// in up trend, plays BB20 rebound
/// we exit all at 2BB top
/// we exit half at 1std up
/// we stop at trailing pull level once profit taken(running lower band or mid band)
/// we stop at pull level before
/// once profit taken, exit logic is we go back below one of the thresholds 2std
/// stop loss logic is once a threshold(u, m, d) is crossed we set it to 1std below threshold
/// </summary>
public class AaPullbackFx : QCAlgorithm
{
Security _contract = null;
private decimal _stopLoss = 0;
private int _trade_count = 0;
private decimal _portfolio_ref_value = 100000;
private string SYMBOL = "EURUSD";
public override void Initialize()
{
SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin);
SetStartDate(year:2017, month:9, day:6);
SetEndDate(year: 2017, month: 9, day: 10);
SetCash(_portfolio_ref_value);
_contract = AddSecurity(SecurityType.Forex, SYMBOL, Resolution.Minute);
}
public override void OnData(Slice slice)
{
var tickSize = Securities[SYMBOL].SymbolProperties.MinimumPriceVariation;
var cBar = slice.Bars[SYMBOL];
Log("bar - H: " + cBar.High.ToString("#.00000") + " L: " + cBar.Low.ToString("#.00000") + " C: " + cBar.Close.ToString("#.00000"));
if (!Portfolio.Invested && _trade_count == 0)
{
//Log("Pullback recovery trigger: price @ " + futureBar.Close.ToString("#.00000") + " BBD @ " + _bdown[1].ToString("#.00000") + " - std @" + std.ToString("#.00000") );
SetHoldings(SYMBOL, 1);
_trade_count++;
_stopLoss = 1.1908m;
Log("Buying: Price is @ " + cBar.Close.ToString("#.00000") + " STOP is @ " + _stopLoss.ToString("#.00000") );
}
//we wait for all orders to be filled
if (Portfolio[Securities[SYMBOL].Symbol].Quantity>0 && Transactions.GetOpenOrders().Count == 0)
{
var orders = Transactions.GetOpenOrders(SYMBOL);
if (orders.Count == 0)
{
decimal qty = Portfolio[SYMBOL].Quantity;
Log("Setting stop loss @ " + _stopLoss.ToString());
StopMarketOrder(SYMBOL, -qty, _stopLoss);
}
}
}
public override void OnEndOfDay()
{
//Plot("Indicator Signal", "EOD", IsDownTrend ? -1 : IsUpTrend ? 1 : 0);
Log("EOD***********************");
_portfolio_ref_value = Portfolio.TotalPortfolioValue;
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
var order = Transactions.GetOrderById(orderEvent.OrderId);
string msg = "OrderEvent: " + order.Status.ToString() + ": " + order.Direction.ToString() + " " + order.Quantity.ToString("#.0") + " " + order.Symbol;
if (order.Type == OrderType.StopMarket)
{
var o = ((QuantConnect.Orders.StopMarketOrder) order);
msg += " - STOP @ " + o.StopPrice.ToString("#.00000");
}
else if (order.Type == OrderType.Market)
{
}
else if (order.Type == OrderType.Limit)
{
var o = ((QuantConnect.Orders.LimitOrder)order);
msg += " - LIMIT @ " + o.LimitPrice.ToString("#.00000");
}
if (order.Status == OrderStatus.Filled)
{
msg += " - filled @ " + order.Price.ToString("#.00000");
}
Log(msg);
}
}
}