| Overall Statistics |
|
Total Trades 261 Average Win 0.74% Average Loss -0.23% Compounding Annual Return 3.264% Drawdown 7.800% Expectancy 0.368 Net Profit 12.821% Sharpe Ratio 0.531 Loss Rate 68% Win Rate 32% Profit-Loss Ratio 3.24 Alpha 0.023 Beta -0.013 Annual Standard Deviation 0.044 Annual Variance 0.002 Information Ratio 0.088 Tracking Error 0.233 Treynor Ratio -1.776 Total Fees $127.40 |
namespace QuantConnect
{
public class ForexMovingAvgCross : QCAlgorithm
{
//Create list of currency pairs to be traded
List<string> Pairs = new List<string>
{
"AUDUSD",
//"EURCHF",
"EURGBP",
//"EURJPY",
"EURUSD",
//"GBPUSD",
"NZDUSD",
"USDCAD",
"USDCHF",
"USDJPY"
};
//Create an instance of the SymbolData object
List<SymbolData> SymbolData = new List<SymbolData>();
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Override the default fee model with
SetBrokerageModel(BrokerageName.FxcmBrokerage);
//Start and End Date range for the backtest:
SetStartDate(2007, 4, 1);
SetEndDate(2010, 12, 31);
//Cash allocation
SetCash(100000);
//Set Warmup Period
//SetWarmUp(TimeSpan.FromDays(100));
//Iterate through the pairs list and prepare data
foreach (var symbol in Pairs)
{
AddForex(symbol, Resolution.Minute, Market.FXCM);
//IEnumerable<TradeBar> bars = History(symbol, 100, Resolution.Daily);
var atr = ATR(symbol, 100);
var fastMA = SMA(symbol, 10, Resolution.Daily);
var slowMA = SMA(symbol, 100, Resolution.Daily);
SymbolData.Add(new SymbolData
{
Symbol = symbol,
Atr = atr,
FastMA = fastMA,
SlowMA = slowMA
});
}
//IEnumerable<Slice> slices = History(TimeSpan.FromDays(100), Resolution.Daily);
}
//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)
{
foreach(var symbolObj in SymbolData)
{
if (!Portfolio[symbolObj.Symbol].Invested)
{
if (symbolObj.FastMA >= symbolObj.SlowMA)
{
//SetHoldings(symbolObj.Symbol, symbolObj.TargetLeverage);
MarketOrder(symbolObj.Symbol, symbolObj.AdjustedLotSize);
}
else
{
//SetHoldings(symbolObj.Symbol, -symbolObj.TargetLeverage);
MarketOrder(symbolObj.Symbol, -symbolObj.AdjustedLotSize);
}
}
else if (Portfolio[symbolObj.Symbol].IsLong && (symbolObj.FastMA < symbolObj.SlowMA))
{
//SetHoldings(symbolObj.Symbol, -symbolObj.TargetLeverage);
Liquidate(symbolObj.Symbol);
MarketOrder(symbolObj.Symbol, -symbolObj.AdjustedLotSize);
}
else if (Portfolio[symbolObj.Symbol].IsShort && (symbolObj.FastMA >= symbolObj.SlowMA))
{
//SetHoldings(symbolObj.Symbol, symbolObj.TargetLeverage);
Liquidate(symbolObj.Symbol);
MarketOrder(symbolObj.Symbol, symbolObj.AdjustedLotSize);
}
}
}
}
class SymbolData
{
public string Symbol;
public AverageTrueRange Atr { get; set; }
public SimpleMovingAverage FastMA { get; set; }
public SimpleMovingAverage SlowMA { get; set; }
// Calculate the optimal leverage based on ATR measured volatility
public double TargetLeverage
{
get
{
return .02D;
}
}
// Calculate the adjusted lot size based on the account balance
public int AdjustedLotSize
{
get
{
return (int)Math.Floor(10055d/1000d) * 1000;
}
}
}
}