| 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 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
namespace QuantConnect
{
/*
------------------------------------------------------------------------
Title: Very Simple ADX DI+ DI- Crossing algorithm
Author: Johannes Ferner, johannes@ferner.me
Date: Sat 4. Feb. 2017
------------------------------------------------------------------------
Description:
The Idea is to trade the crossings of DI+ and DI- through a ADX minimum level
Actions are only taken if the current ADX is above a certain minimum level
Draft:
- Only open new Positions if ADX Value > 20 (_minADXlevel)
- Open Sell Position if DI- crossed through _minADXlevel and DI+ < _minADXlevel
- Open Buy Position if DI+ crossed through _minADXlevel and DI- < _minADXlevel
Next Steps:
- Initial StopLoss
- Trailing StopLoss based on some ATR Magic
*/
public class BasicTemplateAlgorithm : QCAlgorithm
{
string _symbol = "EURUSD";
AverageDirectionalIndex _adx;
QuoteBarConsolidator _consolidator;
decimal _minADXlevel = 20;
bool _firstRun = true;
decimal _beforeADXlevel, _beforeNegativeDirectionalIndex, _beforePositiveDirectionalIndex;
public override void Initialize()
{
//Start and End Date range for the backtest:
SetStartDate(2017, 1, 1);
SetEndDate(DateTime.Now.Date.AddDays(-1));
//Cash allocation
SetCash(5000);
// EURUSD 1:100 Leverage 1 Minute Data
AddForex(_symbol, Resolution.Minute, Market.FXCM, true, 100m);
//AddForex(string ticker, Resolution resolution = Resolution.Minute, string market = Market.FXCM, bool fillDataForward = true, decimal leverage = 0m)
// Set ADX Indicator
_adx = ADX(_symbol, 14, Resolution.Minute);
// Setup the FiveMinutesCallback
_consolidator = new QuoteBarConsolidator( TimeSpan.FromMinutes(5) );
_consolidator.DataConsolidated += FiveMinutesCallback;
SubscriptionManager.AddConsolidator(_symbol, _consolidator);
}
public void Buy(TradeBars data){
// Check for Buy-Oportunity
Log("Current ADX: "+_adx.Current.Value + " minAdxLevel " + _minADXlevel);
if(_minADXlevel < _adx.Current.Value){
Log("Should BUY EURUSD!");
int quantity = 100; // TODO this should be something more sophisticated
MarketOrder("EURUSD", 100);
//Order function places trades: enter the string symbol and the quantity you want:
Order(_symbol, quantity); // TODO Why is this not executed?!
MarketOrder("EURUSD", 100);
//Debug sends messages to the user console: "Time" is the algorithm time keeper object
Debug("Purchased "+_symbol+" on " + Time.ToShortDateString());
}
}
public void Sell(TradeBars data){
// Check for Sell-Oportunity
}
//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)
{
Log("1M ADX Current "+ _adx.Current);
if(!_firstRun){
Buy(data);
Sell(data);
}
// Set the current data to "Before"-Data of next iteration
_beforeADXlevel = _adx.Current.Value;
_beforePositiveDirectionalIndex = _adx.PositiveDirectionalIndex;
_beforeNegativeDirectionalIndex = _adx.NegativeDirectionalIndex;
// Set firstRun to false in order to execute Strategy on Next Data Call
_firstRun = false;
Log("EURUSD: "+Portfolio[_symbol]);
if (Portfolio[_symbol].Invested)
{
Log("Portfolio holds a EURUSD share!");
}
if (!Portfolio[_symbol].Invested)
{
Log("Portfolio holds NO EURUSD share!");
}
}
public void FiveMinutesCallback(Object o, QuoteBar bar)
{
// TODO check if this is Minute-Data or 5-Minute Data
Log("5Minutes!"+Time.ToString("u") + "ADX: "+ _adx.Current+"Negative:"+ _adx.NegativeDirectionalIndex+" Positive:"+ _adx.PositiveDirectionalIndex);
}
}
}