Overall Statistics |
Total Trades 2 Average Win 2.30% Average Loss 0% Compounding Annual Return 1.163% Drawdown 1.100% Expectancy 0 Net Profit 2.346% Sharpe Ratio 0.948 Probabilistic Sharpe Ratio 46.591% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.009 Beta 0.002 Annual Standard Deviation 0.01 Annual Variance 0 Information Ratio -1.288 Tracking Error 0.093 Treynor Ratio 5.168 Total Fees $0.00 |
using System; namespace QuantConnect.Algorithm.CSharp { public class TestEURJPY : QCAlgorithm { //USER VARIABLES private string _AccountCurrency = "USD"; private string _Symbol = "EURJPY"; private decimal _StartingCash = 100000; int _MaxPosition = 50000; int _MinPosition = 1000; int _FastPeriod = 20; int _SlowPeriod = 50; int _TradeCount = 0; // PROGRAM VARIABLES public decimal _Price; public decimal _Quantity; public string _BaseSymbol; public string _QuoteSymbol; public decimal _AvailableMargin; public decimal _LotSize; public decimal _ConversionRate; public decimal _EntryPrice; public decimal _ExitPrice; public decimal _EntryConversionRate; public decimal _ExitConversionRate; public decimal _ExpectedPnL; public decimal _ResidualBaseQuantity; public decimal _ResidualQuoteQuantity; ExponentialMovingAverage _FastEMA; ExponentialMovingAverage _SlowEMA; // INITIALIASE BLOCK public override void Initialize() { SetStartDate(2016, 01, 01); SetEndDate(2017, 12, 31); SetAccountCurrency(_AccountCurrency); SetCash(_StartingCash); var _Forex = AddForex(_Symbol, Resolution.Daily, Market.Oanda, true, 20m); _BaseSymbol = _Forex.BaseCurrencySymbol; SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Margin); SetWarmUp(TimeSpan.FromDays(200)); _FastEMA = EMA(_Symbol, _FastPeriod, Resolution.Daily); _SlowEMA = EMA(_Symbol, _SlowPeriod, Resolution.Daily); } // ONDATA BLOCK public override void OnData(Slice data) { _Price = data[_Symbol].Close; _AvailableMargin = Portfolio.MarginRemaining; _LotSize = Portfolio.Securities[_Symbol].SymbolProperties.LotSize; _ConversionRate = Portfolio.Securities[_Symbol].QuoteCurrency.ConversionRate; if (!Portfolio.Invested && _AvailableMargin > _MinPosition && _TradeCount < 1) { _Quantity = Math.Round((_MaxPosition / (_Price * _ConversionRate)) / _LotSize, 0) * _LotSize; if(_FastEMA > _SlowEMA) { var _EntryTicket = MarketOrder(_Symbol, _Quantity); if (_EntryTicket.Status == OrderStatus.Filled) { _EntryPrice = _EntryTicket.AverageFillPrice; _EntryConversionRate = _ConversionRate; _TradeCount++; _QuoteSymbol = Portfolio.Securities[_Symbol].SymbolProperties.QuoteCurrency; } } } if(Portfolio.Invested) { _Quantity = Portfolio[_Symbol].Quantity; if(_Price > _EntryPrice * 1.05m || _Price < _EntryPrice * 0.95m) { var _ExitTicket = MarketOrder(_Symbol, -_Quantity); if (_ExitTicket.Status == OrderStatus.Filled) { _ExitPrice = _ExitTicket.AverageFillPrice; _ExitConversionRate = _ConversionRate; _ExpectedPnL = (_ExitPrice - _EntryPrice) * _Quantity * _ExitConversionRate; Log($"Expected PnL in {_AccountCurrency} is {Math.Round(_ExpectedPnL,2)}"); Log($"Expected ending Equity in {_AccountCurrency} is {Math.Round(_StartingCash + _ExpectedPnL,2)}"); _ResidualBaseQuantity = Portfolio.CashBook[_BaseSymbol].Amount; _ResidualQuoteQuantity = Portfolio.CashBook[_QuoteSymbol].Amount; //MarketOrder(_AccountCurrency+_QuoteSymbol, _ResidualQuoteQuantity); _ResidualQuoteQuantity = Portfolio.CashBook[_QuoteSymbol].Amount; } } } } } }