Overall Statistics
Total Trades
1656
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic 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
Estimated Strategy Capacity
$1100000.00
Lowest Capacity Asset
NAS100USD 8I
#region imports
from AlgorithmImports import *
#endregion

START_HOUR = 9             # Hour of day to send first order
START_MINUTE = 35       # Minute of hour to send first order

CFD =  "NAS100USD"
INTERVAL = 9
LOSS_AMOUNT = 2
LOT_SIZE = 1

STOP_LOSS_TYPE = "DOLLAR"   # Pick between "DOLLAR" and "PERCENT"     
STOP_LOSS_PERCENT = 0.09
STOP_LOSS_DOLLAR = 9


LOSS_THRESHOLD = 5
STOP_FOR = 50
# region imports
from AlgorithmImports import *
from datetime import *
import config
# endregion

class MuscularApricotHorse(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2022, 7, 21)  
        self.SetEndDate(2022, 7, 22)
        self.SetCash(100000)  
        self.SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Margin)

        self.Start_Time = time(config.START_HOUR, config.START_MINUTE)

        self.NAS_100 = self.AddCfd(config.CFD, Resolution.Second, Market.Oanda).Symbol
        self.Interval = timedelta(seconds=config.INTERVAL)
        self.Loss_Amount = config.LOSS_AMOUNT
        self.Direction = "LONG"
        self.Lot_Size = config.LOT_SIZE
        self.Stop_Loss_Percent = config.STOP_LOSS_PERCENT/100
        self.Stop_Loss_Dollar = config.STOP_LOSS_DOLLAR
        self.Loss_Threshold = config.LOSS_THRESHOLD
        self.Loss_Counter = 0
        self.Stop_For = config.STOP_FOR
        self.Short_Circuit_Time = None
        
        self.Allow_Entry = True
        self.Long_Entry_Time = None
        self.Short_Entry_Time = None
        
        self.First_Order = True

        self.Stop_Loss_Type = config.STOP_LOSS_TYPE
    
        
        self.Long_Buy_Ticket = None
        self.Long_Sell_Ticket = None
        
        self.Short_Sell_Ticket = None
        self.Short_Cover_Ticket = None

        self.Long_Buy_Fill_Price = None
        self.Long_Sell_Fill_Price = None

        self.Short_Sell_Fill_Price = None
        self.Short_Cover_Fill_Price = None
        self.Start_Now = False

        self.Entry_Time_From = time(10,0)   # First number is hour and second number is minute
        self.Entry_Time_To = time(11,0)    # First number is hour and second number is minute
        self.Debug(self.Securities[self.NAS_100].SymbolProperties.LotSize)
        self.Debug(self.Securities[self.NAS_100].Exchange.Hours)
        self.Schedule.On(self.DateRules.EveryDay(), 
                 self.TimeRules.Every(timedelta(seconds=config.INTERVAL)),
                 self.Place_Order)

        self.SetWarmup(10)

    def Reset_Counter(self):
        self.Schedule.Remove(self.Scheduled_Event)
        self.Loss_Counter = 0
        self.Allow_Entry = True

    def Stop_Loss(self):
        open_Orders = self.Portfolio.Transactions.GetOpenOrders(self.NAS_100)

        if len(open_Orders) > 0:
            self.Debug("OPEN ORDERS")
            return
        if self.Portfolio[self.NAS_100].IsShort:
            self.Short_Cover_Ticket = self.MarketOrder(self.NAS_100, self.Lot_Size, tag = "SHORT STOP")
            self.Determine_Direction()
        
        if self.Portfolio[self.NAS_100].IsLong:
            self.Long_Sell_Ticket = self.MarketOrder(self.NAS_100, -self.Lot_Size, tag = "LONG STOP")
            self.Determine_Direction()

    def Place_Order(self):
        if self.IsWarmingUp:
            return


        if self.Portfolio[self.NAS_100].IsShort:
            self.Short_Cover_Ticket = self.MarketOrder(self.NAS_100, self.Lot_Size, tag = "SHORT COVER")
            self.Determine_Direction()
        if not self.First_Order:
            if self.Allow_Entry:
                if not self.Portfolio[self.NAS_100].Invested:
                    if self.Direction == "LONG":
                        self.Long_Buy_Ticket = self.MarketOrder(self.NAS_100, self.Lot_Size, tag = "LONG BUY")
                        self.Long_Entry_Time = self.Time
                        self.Allow_Entry = False
                        self.First_Order = False
        if not self.First_Order:
            if self.Allow_Entry:
                if not self.Portfolio[self.NAS_100].Invested:
                    if self.Direction == "SHORT":
                        self.Short_Sell_Ticket = self.MarketOrder(self.NAS_100, -self.Lot_Size, tag = "SHORT SELL")
                        self.Short_Entry_Time = self.Time
                        self.Allow_Entry = False
                        self.First_Order = False
            
        if self.Portfolio[self.NAS_100].IsLong:
            self.Long_Sell_Ticket = self.MarketOrder(self.NAS_100, -self.Lot_Size, tag = "LONG SELL")
            self.Determine_Direction()
        if not self.First_Order:
            if self.Allow_Entry:
                if not self.Portfolio[self.NAS_100].Invested:
                    if self.Direction == "LONG":
                        self.Long_Buy_Ticket = self.MarketOrder(self.NAS_100, self.Lot_Size, tag = "LONG BUY")
                        self.Long_Entry_Time = self.Time
                        self.Allow_Entry = False
                        self.First_Order = False
        if not self.First_Order:
            if self.Allow_Entry:
                if not self.Portfolio[self.NAS_100].Invested:
                    if self.Direction == "SHORT":
                        self.Short_Sell_Ticket = self.MarketOrder(self.NAS_100, -self.Lot_Size, tag = "SHORT SELL")
                        self.Short_Entry_Time = self.Time
                        self.Allow_Entry = False
                        self.First_Order = False

    def Determine_Direction(self):
        if self.IsWarmingUp:
            return
        if self.Long_Buy_Ticket is not None: 
            if self.Long_Buy_Ticket.Status == OrderStatus.Filled:
                self.Long_Buy_Fill_Price = self.Long_Buy_Ticket.AverageFillPrice
                self.Long_Buy_Ticket = None 
        
        if self.Long_Sell_Ticket is not None:
            if self.Long_Sell_Ticket.Status == OrderStatus.Filled: 
                self.Long_Sell_Fill_Price = self.Long_Sell_Ticket.AverageFillPrice
                Return = self.Long_Sell_Fill_Price - self.Long_Buy_Fill_Price
                if Return < -self.Loss_Amount:
                    self.Direction = "SHORT"
                self.Allow_Entry = True
                self.Long_Sell_Ticket = None
                if Return < 0:
                    self.Loss_Counter = self.Loss_Counter + 1
                else:
                    self.Loss_Counter = 0

                if self.Loss_Counter >= self.Loss_Threshold:
                    self.Allow_Entry = False
                    x = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%H'))
                    y = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%M'))
                    self.Scheduled_Event = self.Schedule.On(self.DateRules.EveryDay(), 
                    self.TimeRules.At(x, y),
                    self.Reset_Counter)

        if self.Short_Sell_Ticket is not None:
            if self.Short_Sell_Ticket.Status == OrderStatus.Filled:
                self.Short_Sell_Fill_Price = self.Short_Sell_Ticket.AverageFillPrice
                self.Short_Sell_Ticket = None

        if self.Short_Cover_Ticket is not None:
            if self.Short_Cover_Ticket.Status == OrderStatus.Filled:
                self.Short_Cover_Fill_Price = self.Short_Cover_Ticket.AverageFillPrice
                Return = self.Short_Sell_Fill_Price - self.Short_Cover_Fill_Price
                if Return < -self.Loss_Amount:
                    self.Direction = "LONG"
                self.Allow_Entry = True
                self.Short_Cover_Ticket = None
                if Return < 0:
                    self.Loss_Counter = self.Loss_Counter + 1
                else:
                    self.Loss_Counter = 0

                if self.Loss_Counter >= self.Loss_Threshold:
                    x = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%H'))
                    y = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%M'))
                    self.Allow_Entry = False
                    self.Scheduled_Event = self.Schedule.On(self.DateRules.EveryDay(), 
                    self.TimeRules.At(x, y),
                    self.Reset_Counter)



    def OnData(self, data: Slice):
        
        if self.IsWarmingUp:
            return

        if self.Stop_Loss_Type == "PERCENT":

            if self.Portfolio[self.NAS_100].UnrealizedProfitPercent < -self.Stop_Loss_Percent:
                # self.Debug(f"STOP LOSS HIT {self.Portfolio[self.NAS_100].UnrealizedProfitPercent/100}%")
                self.Allow_Entry = False
                self.Stop_Loss()

        if self.Stop_Loss_Type == "DOLLAR":
        
            if self.Portfolio[self.NAS_100].UnrealizedProfit < -self.Stop_Loss_Dollar:
                # self.Debug(f"STOP LOSS HIT {self.Portfolio[self.NAS_100].UnrealizedProfit}$")
                self.Allow_Entry = False
                self.Stop_Loss()

        



        # if self.Long_Buy_Ticket is not None: 
        #     if self.Long_Buy_Ticket.Status == OrderStatus.Filled:
        #         self.Long_Buy_Fill_Price = self.Long_Buy_Ticket.AverageFillPrice
        #         self.Long_Buy_Ticket = None 
        
        # if self.Long_Sell_Ticket is not None:
        #     if self.Long_Sell_Ticket.Status == OrderStatus.Filled: 
        #         self.Long_Sell_Fill_Price = self.Long_Sell_Ticket.AverageFillPrice
        #         Return = self.Long_Sell_Fill_Price - self.Long_Buy_Fill_Price
        #         if Return < -self.Loss_Amount:
        #             self.Direction = "SHORT"
        #         self.Allow_Entry = True
        #         self.Long_Sell_Ticket = None
        #         if Return < 0:
        #             self.Loss_Counter = self.Loss_Counter + 1
        #         else:
        #             self.Loss_Counter = 0

        #         if self.Loss_Counter >= self.Loss_Threshold:
        #             self.Allow_Entry = False
        #             x = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%H'))
        #             y = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%M'))
        #             self.Scheduled_Event = self.Schedule.On(self.DateRules.EveryDay(), 
        #             self.TimeRules.At(x, y),
        #             self.Reset_Counter)

        # if self.Short_Sell_Ticket is not None:
        #     if self.Short_Sell_Ticket.Status == OrderStatus.Filled:
        #         self.Short_Sell_Fill_Price = self.Short_Sell_Ticket.AverageFillPrice
        #         self.Short_Sell_Ticket = None

        # if self.Short_Cover_Ticket is not None:
        #     if self.Short_Cover_Ticket.Status == OrderStatus.Filled:
        #         self.Short_Cover_Fill_Price = self.Short_Cover_Ticket.AverageFillPrice
        #         Return = self.Short_Sell_Fill_Price - self.Short_Cover_Fill_Price
        #         if Return < -self.Loss_Amount:
        #             self.Direction = "LONG"
        #         self.Allow_Entry = True
        #         self.Short_Cover_Ticket = None
        #         if Return < 0:
        #             self.Loss_Counter = self.Loss_Counter + 1
        #         else:
        #             self.Loss_Counter = 0

        #         if self.Loss_Counter >= self.Loss_Threshold:
        #             x = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%H'))
        #             y = int((self.Time+ timedelta(seconds=self.Stop_For)).strftime('%M'))
        #             self.Allow_Entry = False
        #             self.Scheduled_Event = self.Schedule.On(self.DateRules.EveryDay(), 
        #             self.TimeRules.At(x, y),
        #             self.Reset_Counter)
        

        current_Time = self.Time
        #if (current_Time.strftime('%H%M') > self.Entry_Time_From.strftime('%H%M') and current_Time.strftime('%H%M') < self.Entry_Time_To.strftime('%H%M')):

        if current_Time.strftime('%H%M') >= self.Start_Time.strftime('%H%M'):
            if self.First_Order:
                if self.Allow_Entry:
                    if not self.Portfolio[self.NAS_100].Invested:
                        if self.Direction == "LONG":
                            self.Long_Buy_Ticket = self.MarketOrder(self.NAS_100, self.Lot_Size, tag = "LONG BUY")
                            self.Long_Entry_Time = self.Time
                            self.Allow_Entry = False
                            self.First_Order = False

                if self.Allow_Entry:
                    if not self.Portfolio[self.NAS_100].Invested:
                        if self.Direction == "SHORT":
                            self.Short_Sell_Ticket = self.MarketOrder(self.NAS_100, -self.Lot_Size, tag = "SHORT SELL")
                            self.Short_Entry_Time = self.Time
                            self.Allow_Entry = False
                            self.First_Order = False
        
        # if self.Portfolio[self._continuousContract.Mapped].IsLong:
          
        #     if self.Time >= self.Long_Entry_Time + self.Interval:
        #         self.Long_Sell_Ticket = self.MarketOrder(self._continuousContract.Mapped, -self.Lot_Size, tag = "LONG SELL")
        
        # if self.Portfolio[self._continuousContract.Mapped].IsShort:
        
        #     if self.Time >= self.Short_Entry_Time + self.Interval:
        #         self.Short_Cover_Ticket = self.MarketOrder(self._continuousContract.Mapped, self.Lot_Size, tag = "SHORT COVER")