Overall Statistics
Total Trades
18
Average Win
0%
Average Loss
-0.93%
Compounding Annual Return
-99.851%
Drawdown
9.700%
Expectancy
-1
Net Profit
-8.050%
Sharpe Ratio
-5.03
Probabilistic Sharpe Ratio
0%
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-3.861
Beta
1.281
Annual Standard Deviation
0.183
Annual Variance
0.033
Information Ratio
-26.353
Tracking Error
0.122
Treynor Ratio
-0.718
Total Fees
$0.00
Estimated Strategy Capacity
$250000.00
Lowest Capacity Asset
NAS100USD 8I
Portfolio Turnover
3879.86%
from AlgorithmImports import *


class MyAlgorithm(QCAlgorithm):
    
    def Initialize(self):
        self.SetStartDate(2023, 8, 28)
        self.SetEndDate(2023, 9, 2)
        self.SetCash(100000)
        
        self.symbol = self.AddCfd("NAS100USD").Symbol
        
        self.window = RollingWindow[IBaseDataBar](3)
        self.highWindow = RollingWindow[float](3)
        self.lowWindow = RollingWindow[float](3)
        self.openWindow = RollingWindow[float](3)
        self.closeWindow = RollingWindow[float](3)
        
        self.levels = {}
        self.orders = {}

    def OnData(self, data):
        self.highWindow.Add(data[self.symbol].High)
        self.lowWindow.Add(data[self.symbol].Low)
        self.openWindow.Add(data[self.symbol].Open)
        self.closeWindow.Add(data[self.symbol].Close)

        current_utc_time = self.UtcTime
        if current_utc_time.hour==20:
            self.Liquidate()

        if (current_utc_time.hour >= 14 and current_utc_time.hour < 20 and self.highWindow[2] - self.lowWindow[2]>12 and self.highWindow[2] - self.lowWindow[2]<40):
            if self.openWindow[2] > self.closeWindow[2]:
                if self.closeWindow[1] > self.highWindow[2]:
                    self.levels[data.Time] = {
                        "type": "Long",
                        "buy": self.highWindow[2],
                        "stoploss": self.lowWindow[2],
                        "take_profit": self.highWindow[2] + 2 * (self.highWindow[2] - self.lowWindow[2])
                    }

            # Calculating order size and placing orders
            for symbol in data.Keys:
                if data.Time in self.levels:
                    risk = self.Portfolio.Cash * 0.01
                    level = self.levels[data.Time]
                    order_size = risk / (level["buy"] - level["stoploss"])

                    if level["type"] == "Long":
                        self.orders[data.Time] = self.LimitOrder(self.symbol, order_size, level["buy"])
                        self.orders[data.Time] = self.StopMarketOrder(self.symbol, -order_size, level["stoploss"])