| Overall Statistics |
|
Total Trades 22 Average Win 4.27% Average Loss -3.06% Compounding Annual Return 6511.615% Drawdown 6.300% Expectancy 0.522 Net Profit 17.496% Sharpe Ratio 9.211 Loss Rate 36% Win Rate 64% Profit-Loss Ratio 1.39 Alpha 5.62 Beta -133.464 Annual Standard Deviation 0.377 Annual Variance 0.142 Information Ratio 9.166 Tracking Error 0.377 Treynor Ratio -0.026 Total Fees $0.00 |
namespace QuantConnect
{
public class BasicTemplateAlgorithm : QCAlgorithm
{
public string[] Symbols = {"AUDUSD", "EURUSD", "USDCAD", "USDJPY"};
private Dictionary<string, DonchianChannel> Local = new Dictionary<string, DonchianChannel>();
private Dictionary<string, RollingWindow<bool>> Entered = new Dictionary<string, RollingWindow<bool>>();
public Dictionary<string, DateTime> Entry = new Dictionary<string, DateTime>();
public Dictionary<string, decimal> High = new Dictionary<string, decimal>();
public Dictionary<string, decimal> Low = new Dictionary<string, decimal>();
public bool Day;
public override void Initialize()
{
SetStartDate(2018, 1, 1);
SetEndDate(DateTime.Now);
SetCash(10000);
foreach (var symbol in Symbols)
{
AddForex(symbol, Resolution.Minute);
Local[symbol] = DCH(symbol, 24, Resolution.Hour);
Entered[symbol] = new RollingWindow<bool>(2);
}
SetWarmup(1500);
}
public void OnData(QuoteBars data)
{
foreach (var symbol in Symbols)
{
Entered[symbol].Add(Portfolio[symbol].Invested);
if (!Entered[symbol].IsReady) return;
if (!data.ContainsKey(symbol)) return;
if (!Local.ContainsKey(symbol)) return;
if (!Entered.ContainsKey(symbol)) return;
if (!Entry.ContainsKey(symbol)){
Entry.Add(symbol, Time);
}
if (!High.ContainsKey(symbol)){
High.Add(symbol, data[symbol].High);
}
if (!Low.ContainsKey(symbol)){
Low.Add(symbol, data[symbol].Low);
}
}
foreach (var symbol in Symbols)
{
Schedule.On(DateRules.EveryDay(symbol), TimeRules.At(17, 00), () =>
{
High[symbol] = Local[symbol].UpperBand;
Low[symbol] = Local[symbol].LowerBand;
Day = false;
});
}
foreach (var symbol in Symbols)
{
if (!(High[symbol] > 0 && Low[symbol] > 0)) return;
if (Entered[symbol][0] && !Entered[symbol][1])
{
Transactions.CancelOpenOrders(symbol);
//Entry[symbol] = Time;
if (Portfolio[symbol].IsShort)
{
Notify.Sms("5714396200","Algorithm opened short of " + symbol + " at " + Low[symbol]);
Notify.Sms("8188529720","Algorithm opened short of " + symbol + " at " + Low[symbol]);
}
if (Portfolio[symbol].IsLong)
{
Notify.Sms("5714396200","Algorithm opened long of " + symbol + " at " + High[symbol]);
Notify.Sms("8188529720","Algorithm opened long of " + symbol + " at " + High[symbol]);
}
}
}
if (Day == true) return;
foreach (var symbol in Symbols)
{
var qty = CalculateOrderQuantity(symbol, 12.5m);
if (!Portfolio[symbol].Invested)
{
Transactions.CancelOpenOrders(symbol);
StopLimitOrder(symbol, qty, High[symbol], High[symbol], "Breakout at " + High[symbol]);
StopLimitOrder(symbol, -qty, Low[symbol], Low[symbol], "Breakdown at " + Low[symbol]);
Log("Orders should be out at " + High[symbol] + " and " + Low[symbol]);
}
if (Portfolio[symbol].Invested)// && (Time- Entry[symbol] >= TimeSpan.FromDays(1)))
{
if (Portfolio[symbol].IsShort)
{
Notify.Sms("5714396200","Algorithm covered short of " + symbol + " at " + data[symbol].Close);
Notify.Sms("8188529720","Algorithm covered short of " + symbol + " at " + data[symbol].Close);
}
if (Portfolio[symbol].IsLong)
{
Notify.Sms("5714396200","Algorithm closed long of " + symbol + " at " + data[symbol].Close);
Notify.Sms("8188529720","Algorithm closed long of " + symbol + " at " + data[symbol].Close);
}
Transactions.CancelOpenOrders(symbol);
LimitOrder(symbol, -Portfolio[symbol].Quantity, data[symbol].Close, "Time is " + Time + " and Price is " + data[symbol].Close);
}
}
Day = true;
}
}
}