Overall Statistics
Total Trades
45
Average Win
0.46%
Average Loss
-0.51%
Compounding Annual Return
-31.273%
Drawdown
11.800%
Expectancy
-0.567
Net Profit
-5.882%
Sharpe Ratio
-1.188
Probabilistic Sharpe Ratio
11.831%
Loss Rate
77%
Win Rate
23%
Profit-Loss Ratio
0.91
Alpha
-0.238
Beta
0.112
Annual Standard Deviation
0.184
Annual Variance
0.034
Information Ratio
-1.814
Tracking Error
0.218
Treynor Ratio
-1.952
Total Fees
$0.00
Estimated Strategy Capacity
$850000.00
Lowest Capacity Asset
GBPUSD 8G
#region imports
from AlgorithmImports import *
from decimal import *
from datetime import timedelta
#endregion

class LogicalApricotFrog(QCAlgorithm):


        def Initialize(self):

            self.SetTimeZone(TimeZones.London) # Timezone set to GMT - logs will be in GMT
            self.SetStartDate(2023, 1, 1) 
            self.SetEndDate(2023, 3, 1)
            self.SetCash(10000)
            self.symbol = self.AddForex("GBPUSD", Resolution.Hour, Market.Oanda).Symbol   

            self.fast = self.SMA(self.symbol, int(self.GetParameter('SmaFast')), Resolution.Hour)
            self.slow = self.SMA(self.symbol, int(self.GetParameter('SmaSlow')), Resolution.Hour)

            self.SetWarmUp(50)
            self.fastValues = RollingWindow[float](2) 
            self.slowValues = RollingWindow[float](2)

        
        def OnData(self, data): 
            
            self.fastValues.Add(self.fast.Current.Value) 
            self.slowValues.Add(self.slow.Current.Value)

            if self.IsWarmingUp:
               return         

            past_fast_SMA = self.fastValues[1] 
            past_slow_SMA = self.slowValues[1] 

            fast_SMA = self.fast.Current.Value 
            slow_SMA = self.slow.Current.Value

            if self.fastValues.IsReady and self.slowValues.IsReady: 

                if (fast_SMA > slow_SMA) and (past_fast_SMA < past_slow_SMA):  
                                       
                    self.MarketOrder(self.symbol, (10000))   
                    self.LimitOrder(self.symbol, (-10000), data[self.symbol].Close + 0.0050)
                    self.StopMarketOrder(self.symbol, (-10000), data[self.symbol].Close - 0.0020)

                    self.Log('###########  LONG  #################')
                    self.Log("Time    >> {0}".format(self.Time))
                    self.Log('If (fastEMA > slowEMA) & (pastFastEma < pastSlowEma):')
                    self.Log("pastFastEma >> {0}".format(self.fastValues[1]))
                    self.Log("pastSlowEma  >> {0}".format(self.slowValues[1]))
                    self.Log("Current fast_EMA >> {0}".format(self.fast.Current.Value))
                    self.Log("Current slow_EMA   >> {0}".format(self.slow.Current.Value))
                    self.Log("Long  @ >> {0}".format(self.Securities[self.symbol].Price))
                    self.Log('Limit @ >> {0}'.format((self.Securities[self.symbol].Price) + 0.0050))
                    self.Log('Stop  @ >> {0}'.format((self.Securities[self.symbol].Price) - 0.0020))
                    

        def OnOrderEvent(self, orderEvent):

            order = self.Transactions.GetOrderById(orderEvent.OrderId)
            if order.Status == OrderStatus.Filled:
                if order.Type == OrderType.Limit or OrderType.StopMarket:
                    self.Transactions.CancelOpenOrders(order.Symbol)
            if order.Status == OrderStatus.Canceled:
                self.Log(str(orderEvent))