Announcement

Collapse
No announcement yet.

Partner 728x90

Collapse

What is best practice for using AddDataSeries with a strategy?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    What is best practice for using AddDataSeries with a strategy?

    Hello I am a bit confused and surprised while consulting the Ninjascript documentation.
    Specifically regarding the AddDataSeries entry seen here,

    HTML Code:
    https://ninjatrader.com/support/helpGuides/nt8/NT%20HelpGuide%20English.html?addchartindicator.htm
    Suppose I am using a strategy on various instruments and no matter which instrument I am on I wish for the Boolean result of another indicator called DynamicTickingES to return information of the trend that the ES is in... ESup[0]= true; or ESdown[0]=true; ?

    Obviously I must specify that the DynamicTickingES must be applied to a chart of an ES however I am not finding the Best Practice for doing so...
    Please correct me if I am misunderstanding the situation or if it was explained somewhere else as I often overlook such details.

    So to summarize once I have added another data series to a strategy how do I apply an Indicator to this secondary data series "ES 1000 tick" and how should the strategy read the Boolean values of this ES indicator from the ES 1000 tick data series and the chart of the security of which the strategy will execute?

    Code:
    #region Using declarations
    #endregion
    
    //This namespace holds Strategies in this folder and is required. Do not change it.
    namespace NinjaTrader.NinjaScript.Strategies
    {
        public class DynamicTrendPhase : Strategy
        {        
            private DynamicTickingES dynamicTickingES;              
    
            protected override void OnStateChange()
            {
                if (State == State.SetDefaults)
                {
                    Description                                    = @"The Trend Scale is to be modeled as an Consolidation with a Distribution with a Dynamic Phase... The counter-phase distribution will be neglected for fear of poor choppy price action";
                    Name                                        = "DynamicTrendPhase";
                    Calculate                                    = Calculate.OnBarClose;
                    EntriesPerDirection                            = 1;
                    EntryHandling                                = EntryHandling.AllEntries;
                    IsExitOnSessionCloseStrategy                = true;
                    ExitOnSessionCloseSeconds                    = 300;
                    IsFillLimitOnTouch                            = false;
                    MaximumBarsLookBack                            = MaximumBarsLookBack.Infinite;//TwoHundredFiftySix;
                    OrderFillResolution                            = OrderFillResolution.High;
                    OrderFillResolutionType                        = BarsPeriodType.Tick;
                    OrderFillResolutionValue                    = 1;
                    Slippage                                    = 0;
                    StartBehavior                                = StartBehavior.WaitUntilFlat;
                    TimeInForce                                    = TimeInForce.Gtc;
                    TraceOrders                                    = true;
                    RealtimeErrorHandling                        = RealtimeErrorHandling.StopCancelClose;
                    StopTargetHandling                            = StopTargetHandling.PerEntryExecution;
                    BarsRequiredToTrade                            = 100;
                    // Disable this property for performance gains in Strategy Analyzer optimizations
                    // See the Help Guide for additional information
                    IsInstantiatedOnEachOptimizationIteration    = true;                
          
                   }
                else if (State == State.Configure)
                {
                 AddDataSeries("ES", Data.BarsPeriodType.Tick, 1000, Data.MarketDataType.Last);
                
                }
                else if (State == State.DataLoaded)
                {
                    ClearOutputWindow();            
                    
                    /// HOW do I use this when it is NOT a chart indicator?????
                dynamicTickingES = AddChartIndicator(DynamicTickingES("ES", Data.BarsPeriodType.Tick, 1000, Data.MarketDataType.Last));
                    /// I dont see any relevant functions for  dynamicTickingES = new AddIndicator
                    
                }
            }
    
            protected override void OnBarUpdate()
    {
        
        if ( DynamicTrendScaleConstantVWMA(VWMAcrossStabilizeDelay,PromptPeriodVWMA,FullPeriodVWMA).esUp[0] )
                {                
                    EnterLong(Convert.ToInt32(DefaultQuantity), "");
                                    
                }
                
        if ( DynamicTrendScaleConstantVWMA(VWMAcrossStabilizeDelay,PromptPeriodVWMA,FullPeriodVWMA).esDown[0] )
                {                
                    EnterShort(Convert.ToInt32(DefaultQuantity), "");
                                
                }
                
                ​
    Last edited by DynamicTest; 05-31-2024, 03:07 AM.

    #2
    So while the use of AddDataSeries() is very straightforward from the documentation



    HTML Code:
    https://ninjatrader.com/support/helpGuides/nt8/NT%20HelpGuide%20English.html?addchartindicator.htm
    For the following
    Code:
     else if (State == State.Configure)
    {
    AddDataSeries("ES", Data.BarsPeriodType.Tick, 1000, Data.MarketDataType.Last);
    
    }

    I am unable to find how to retrieve the Boolean Values from an indicator which must be applied to this secondary data series which is applied to the strategy with the AddDataSeries() command.

    Code:
    DynamicTrendScaleConstantVWMA(VWMAcrossStabilizeDelay,PromptPeriodVWMA,FullPeriodVWMA).esUp[0]
    Or

    Code:
    DynamicTrendScaleConstantVWMA(VWMAcrossStabilizeDelay,PromptPeriodVWMA,FullPeriodVWMA).esDown[0]
    Thank you very much for your guidance
    Last edited by DynamicTest; 05-31-2024, 03:36 AM.

    Comment


      #4
      To create a strategy in NinjaTrader that uses a secondary data series and applies an indicator to this series, you need to follow these steps:
      1. Add the Secondary Data Series: Use the AddDataSeries method to include the ES 1000 tick data series.
      2. Apply the Indicator to the Secondary Data Series: Create an instance of your indicator and specify that it should use the secondary series.
      3. Read the Boolean Values from the Indicator: Access the values from your custom indicator and use them in your strategy logic.

      Here's a step-by-step implementation: Step 1: Add the Secondary Data Series


      You need to add the ES 1000 tick data series in the OnStateChange method. Step 2: Apply the Indicator to the Secondary Data Series


      Instantiate your DynamicTickingES indicator and ensure it uses the secondary data series. Step 3: Read Boolean Values from the Indicator


      Check the values of ESup and ESdown from your custom indicator and apply the trading logic accordingly.

      Here's an example code to implement this:

      Code:
      using NinjaTrader.NinjaScript;
      using NinjaTrader.Data;
      
      namespace NinjaTrader.NinjaScript.Strategies
      {
      public class CustomStrategy : Strategy
      {
      private DynamicTickingES dynamicTickingES;
      
      protected override void OnStateChange()
      {
      if (State == State.SetDefaults)
      {
      Description = "Custom Strategy with ES 1000 tick data series";
      Name = "CustomStrategy";
      Calculate = Calculate.OnEachTick;
      IsInstantiatedOnEachOptimizationIteration = false;
      }
      else if (State == State.Configure)
      {
      AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);
      }
      else if (State == State.DataLoaded)
      {
      dynamicTickingES = DynamicTickingES(BarsArray[1]);
      }
      }
      
      protected override void OnBarUpdate()
      {
      // Ensure we have enough bars before proceeding
      if (CurrentBars[0] < BarsRequiredToTrade || CurrentBars[1] < BarsRequiredToTrade)
      return;
      
      // Check if we are updating on the primary data series
      if (BarsInProgress == 0)
      {
      // Access the indicator values on the secondary data series
      if (dynamicTickingES.ESup[0])
      {
      // Logic when ES is up
      Print("ES is trending up");
      // Enter a long position
      EnterLong();
      }
      else if (dynamicTickingES.ESdown[0])
      {
      // Logic when ES is down
      Print("ES is trending down");
      // Enter a short position
      EnterShort();
      }
      }
      }
      }
      }

      Explanation:
      1. OnStateChange:
        • In the State.Configure block, the secondary data series (ES 1000 tick) is added using AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);.
        • In the State.DataLoaded block, an instance of the DynamicTickingES indicator is created and linked to the secondary data series using BarsArray[1].
      2. OnBarUpdate:
        • The method checks if there are enough bars to proceed using CurrentBars.
        • Logic is applied only when BarsInProgress == 0, indicating updates on the primary data series.
        • It accesses the ESup and ESdown properties from the DynamicTickingES indicator and executes trades based on the trend.

      This approach ensures that your strategy on various instruments reads the trend from the ES 1000 tick data series and acts accordingly. Let me know if you need further details or assistance!

      Comment


        #5
        Originally posted by NinjaTrader_Dennis View Post
        To create a strategy in NinjaTrader that uses a secondary data series and applies an indicator to this series, you need to follow these steps:
        1. Add the Secondary Data Series: Use the AddDataSeries method to include the ES 1000 tick data series.
        2. Apply the Indicator to the Secondary Data Series: Create an instance of your indicator and specify that it should use the secondary series.
        3. Read the Boolean Values from the Indicator: Access the values from your custom indicator and use them in your strategy logic.

        Here's a step-by-step implementation: Step 1: Add the Secondary Data Series


        You need to add the ES 1000 tick data series in the OnStateChange method. Step 2: Apply the Indicator to the Secondary Data Series


        Instantiate your DynamicTickingES indicator and ensure it uses the secondary data series. Step 3: Read Boolean Values from the Indicator


        Check the values of ESup and ESdown from your custom indicator and apply the trading logic accordingly.

        Here's an example code to implement this:

        Code:
        using NinjaTrader.NinjaScript;
        using NinjaTrader.Data;
        
        namespace NinjaTrader.NinjaScript.Strategies
        {
        public class CustomStrategy : Strategy
        {
        private DynamicTickingES dynamicTickingES;
        
        protected override void OnStateChange()
        {
        if (State == State.SetDefaults)
        {
        Description = "Custom Strategy with ES 1000 tick data series";
        Name = "CustomStrategy";
        Calculate = Calculate.OnEachTick;
        IsInstantiatedOnEachOptimizationIteration = false;
        }
        else if (State == State.Configure)
        {
        AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);
        }
        else if (State == State.DataLoaded)
        {
        dynamicTickingES = DynamicTickingES(BarsArray[1]);
        }
        }
        
        protected override void OnBarUpdate()
        {
        // Ensure we have enough bars before proceeding
        if (CurrentBars[0] < BarsRequiredToTrade || CurrentBars[1] < BarsRequiredToTrade)
        return;
        
        // Check if we are updating on the primary data series
        if (BarsInProgress == 0)
        {
        // Access the indicator values on the secondary data series
        if (dynamicTickingES.ESup[0])
        {
        // Logic when ES is up
        Print("ES is trending up");
        // Enter a long position
        EnterLong();
        }
        else if (dynamicTickingES.ESdown[0])
        {
        // Logic when ES is down
        Print("ES is trending down");
        // Enter a short position
        EnterShort();
        }
        }
        }
        }
        }

        Explanation:
        1. OnStateChange:
          • In the State.Configure block, the secondary data series (ES 1000 tick) is added using AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);.
          • In the State.DataLoaded block, an instance of the DynamicTickingES indicator is created and linked to the secondary data series using BarsArray[1].
        2. OnBarUpdate:
          • The method checks if there are enough bars to proceed using CurrentBars.
          • Logic is applied only when BarsInProgress == 0, indicating updates on the primary data series.
          • It accesses the ESup and ESdown properties from the DynamicTickingES indicator and executes trades based on the trend.

        This approach ensures that your strategy on various instruments reads the trend from the ES 1000 tick data series and acts accordingly. Let me know if you need further details or assistance!

        Unfortunately in your example the strategy will not read the Boolean value from the secondary data series (ES 1000 tick)
        I verified that this Boolean was in fact returning the correct values on the indicator itself which you may see in the attached file.

        Please use the attached indicator for your convenience to correct your example strategy so that it may read and trade from the Boolean values from AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);
        Attached Files

        Comment


          #6
          Click image for larger version

Name:	NinjascriptAddDataSeriesWithAStrategy.png
Views:	74
Size:	435.4 KB
ID:	1306156 I verified that the attached indicator is returning the correct Boolean Values when running on its native chart.
          However, when I recreate your example there is no way to read the Boolean Values while this indicator is running from the Added Data Series on the ES.

          I have tried many typical C# functions which I also failed.
          Code:
              //bool ESuptrend = dynamicTickingES.ESup[0]; 
              //bool ESdowntrend = dynamicTickingES.ESdown[0];
              //bool ESconstrained = dynamicTickingES.ESconstrained[0];​
          There must be something in the documentation which I am overlooking sir?
          I know in fact I am not the first person to use MultiInstrument Strategies after all there are default tutorials which work... For some reason the example I was provided with does not work .

          Thank You

          Comment


            #7
            Originally posted by NinjaTrader_Dennis View Post
            To create a strategy in NinjaTrader that uses a secondary data series and applies an indicator to this series, you need to follow these steps:
            1. Add the Secondary Data Series: Use the AddDataSeries method to include the ES 1000 tick data series.
            2. Apply the Indicator to the Secondary Data Series: Create an instance of your indicator and specify that it should use the secondary series.
            3. Read the Boolean Values from the Indicator: Access the values from your custom indicator and use them in your strategy logic.

            Here's a step-by-step implementation: Step 1: Add the Secondary Data Series


            You need to add the ES 1000 tick data series in the OnStateChange method. Step 2: Apply the Indicator to the Secondary Data Series


            Instantiate your DynamicTickingES indicator and ensure it uses the secondary data series. Step 3: Read Boolean Values from the Indicator


            Check the values of ESup and ESdown from your custom indicator and apply the trading logic accordingly.

            Here's an example code to implement this:

            Code:
            using NinjaTrader.NinjaScript;
            using NinjaTrader.Data;
            
            namespace NinjaTrader.NinjaScript.Strategies
            {
            public class CustomStrategy : Strategy
            {
            private DynamicTickingES dynamicTickingES;
            
            protected override void OnStateChange()
            {
            if (State == State.SetDefaults)
            {
            Description = "Custom Strategy with ES 1000 tick data series";
            Name = "CustomStrategy";
            Calculate = Calculate.OnEachTick;
            IsInstantiatedOnEachOptimizationIteration = false;
            }
            else if (State == State.Configure)
            {
            AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);
            }
            else if (State == State.DataLoaded)
            {
            dynamicTickingES = DynamicTickingES(BarsArray[1]);
            }
            }
            
            protected override void OnBarUpdate()
            {
            // Ensure we have enough bars before proceeding
            if (CurrentBars[0] < BarsRequiredToTrade || CurrentBars[1] < BarsRequiredToTrade)
            return;
            
            // Check if we are updating on the primary data series
            if (BarsInProgress == 0)
            {
            // Access the indicator values on the secondary data series
            if (dynamicTickingES.ESup[0])
            {
            // Logic when ES is up
            Print("ES is trending up");
            // Enter a long position
            EnterLong();
            }
            else if (dynamicTickingES.ESdown[0])
            {
            // Logic when ES is down
            Print("ES is trending down");
            // Enter a short position
            EnterShort();
            }
            }
            }
            }
            }
            ​
            ​ Explanation:
            1. OnStateChange:
              • In the State.Configure block, the secondary data series (ES 1000 tick) is added using AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);.
              • In the State.DataLoaded block, an instance of the DynamicTickingES indicator is created and linked to the secondary data series using BarsArray[1].
            2. OnBarUpdate:
              • The method checks if there are enough bars to proceed using CurrentBars.
              • Logic is applied only when BarsInProgress == 0, indicating updates on the primary data series.
              • It accesses the ESup and ESdown properties from the DynamicTickingES indicator and executes trades based on the trend.

            This approach ensures that your strategy on various instruments reads the trend from the ES 1000 tick data series and acts accordingly. Let me know if you need further details or assistance!
            Is it possible that this is not a matter of C language but there is a best practice in which we must also add yet another series of a 1 tick data series so that the chart will access the Data Series???
            I have seen many other comments on this subject, but I have not seen an official document?

            Creating a multi-instrument strategy - NinjaTrader Support Forum​
            Attached Files

            Comment


              #8
              Originally posted by NinjaTrader_Dennis View Post
              To create a strategy in NinjaTrader that uses a secondary data series and applies an indicator to this series, you need to follow these steps:
              1. Add the Secondary Data Series: Use the AddDataSeries method to include the ES 1000 tick data series.
              2. Apply the Indicator to the Secondary Data Series: Create an instance of your indicator and specify that it should use the secondary series.
              3. Read the Boolean Values from the Indicator: Access the values from your custom indicator and use them in your strategy logic.

              Here's a step-by-step implementation: Step 1: Add the Secondary Data Series


              You need to add the ES 1000 tick data series in the OnStateChange method. Step 2: Apply the Indicator to the Secondary Data Series


              Instantiate your DynamicTickingES indicator and ensure it uses the secondary data series. Step 3: Read Boolean Values from the Indicator


              Check the values of ESup and ESdown from your custom indicator and apply the trading logic accordingly.

              Here's an example code to implement this:

              Code:
              using NinjaTrader.NinjaScript;
              using NinjaTrader.Data;
              
              namespace NinjaTrader.NinjaScript.Strategies
              {
              public class CustomStrategy : Strategy
              {
              private DynamicTickingES dynamicTickingES;
              
              protected override void OnStateChange()
              {
              if (State == State.SetDefaults)
              {
              Description = "Custom Strategy with ES 1000 tick data series";
              Name = "CustomStrategy";
              Calculate = Calculate.OnEachTick;
              IsInstantiatedOnEachOptimizationIteration = false;
              }
              else if (State == State.Configure)
              {
              AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);
              }
              else if (State == State.DataLoaded)
              {
              dynamicTickingES = DynamicTickingES(BarsArray[1]);
              }
              }
              
              protected override void OnBarUpdate()
              {
              // Ensure we have enough bars before proceeding
              if (CurrentBars[0] < BarsRequiredToTrade || CurrentBars[1] < BarsRequiredToTrade)
              return;
              
              // Check if we are updating on the primary data series
              if (BarsInProgress == 0)
              {
              // Access the indicator values on the secondary data series
              if (dynamicTickingES.ESup[0])
              {
              // Logic when ES is up
              Print("ES is trending up");
              // Enter a long position
              EnterLong();
              }
              else if (dynamicTickingES.ESdown[0])
              {
              // Logic when ES is down
              Print("ES is trending down");
              // Enter a short position
              EnterShort();
              }
              }
              }
              }
              }

              Explanation:
              1. OnStateChange:
                • In the State.Configure block, the secondary data series (ES 1000 tick) is added using AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);.
                • In the State.DataLoaded block, an instance of the DynamicTickingES indicator is created and linked to the secondary data series using BarsArray[1].
              2. OnBarUpdate:
                • The method checks if there are enough bars to proceed using CurrentBars.
                • Logic is applied only when BarsInProgress == 0, indicating updates on the primary data series.
                • It accesses the ESup and ESdown properties from the DynamicTickingES indicator and executes trades based on the trend.

              This approach ensures that your strategy on various instruments reads the trend from the ES 1000 tick data series and acts accordingly. Let me know if you need further details or assistance!
              After work today, I debugged some syntax issues with the default tests on the number of BarsRequiredToTrade...
              The Boolean Values are now accessible on the example you shared.

              It seems to be solved with some unexpected rewriting...

              Thank you again for your guidance sir.

              Comment


                #9
                Originally posted by NinjaTrader_Dennis View Post
                To create a strategy in NinjaTrader that uses a secondary data series and applies an indicator to this series, you need to follow these steps:
                1. Add the Secondary Data Series: Use the AddDataSeries method to include the ES 1000 tick data series.
                2. Apply the Indicator to the Secondary Data Series: Create an instance of your indicator and specify that it should use the secondary series.
                3. Read the Boolean Values from the Indicator: Access the values from your custom indicator and use them in your strategy logic.

                Here's a step-by-step implementation: Step 1: Add the Secondary Data Series


                You need to add the ES 1000 tick data series in the OnStateChange method. Step 2: Apply the Indicator to the Secondary Data Series


                Instantiate your DynamicTickingES indicator and ensure it uses the secondary data series. Step 3: Read Boolean Values from the Indicator


                Check the values of ESup and ESdown from your custom indicator and apply the trading logic accordingly.

                Here's an example code to implement this:

                Code:
                using NinjaTrader.NinjaScript;
                using NinjaTrader.Data;
                
                namespace NinjaTrader.NinjaScript.Strategies
                {
                public class CustomStrategy : Strategy
                {
                private DynamicTickingES dynamicTickingES;
                
                protected override void OnStateChange()
                {
                if (State == State.SetDefaults)
                {
                Description = "Custom Strategy with ES 1000 tick data series";
                Name = "CustomStrategy";
                Calculate = Calculate.OnEachTick;
                IsInstantiatedOnEachOptimizationIteration = false;
                }
                else if (State == State.Configure)
                {
                AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);
                }
                else if (State == State.DataLoaded)
                {
                dynamicTickingES = DynamicTickingES(BarsArray[1]);
                }
                }
                
                protected override void OnBarUpdate()
                {
                // Ensure we have enough bars before proceeding
                if (CurrentBars[0] < BarsRequiredToTrade || CurrentBars[1] < BarsRequiredToTrade)
                return;
                
                // Check if we are updating on the primary data series
                if (BarsInProgress == 0)
                {
                // Access the indicator values on the secondary data series
                if (dynamicTickingES.ESup[0])
                {
                // Logic when ES is up
                Print("ES is trending up");
                // Enter a long position
                EnterLong();
                }
                else if (dynamicTickingES.ESdown[0])
                {
                // Logic when ES is down
                Print("ES is trending down");
                // Enter a short position
                EnterShort();
                }
                }
                }
                }
                }

                Explanation:
                1. OnStateChange:
                  • In the State.Configure block, the secondary data series (ES 1000 tick) is added using AddDataSeries("ES 06-23", Data.BarsPeriodType.Tick, 1000);.
                  • In the State.DataLoaded block, an instance of the DynamicTickingES indicator is created and linked to the secondary data series using BarsArray[1].
                2. OnBarUpdate:
                  • The method checks if there are enough bars to proceed using CurrentBars.
                  • Logic is applied only when BarsInProgress == 0, indicating updates on the primary data series.
                  • It accesses the ESup and ESdown properties from the DynamicTickingES indicator and executes trades based on the trend.

                This approach ensures that your strategy on various instruments reads the trend from the ES 1000 tick data series and acts accordingly. Let me know if you need further details or assistance!
                Thank You Dennis !

                Comment


                  #10
                  Hello DynamicTest,

                  As this inquiry is about NinjaScript indicator and strategy development, I've moved your post from the NinjaTrader Desktop > Platform Technical Support​ section of the forums to the NinjaTrader Desktop > General Development​ section of the forums.

                  Some tips:

                  Use null as the instrument name parameter supplied to AddDataSeries() if you want the secondary series to use the same instrument as the primary series (chart bars) but with a different bar type or interval.
                  "Tips
                  ...
                  4. For the instrument name parameter null could be passed in, resulting in the primary data series instrument being used."
                  Help guide: NinjaScript > Language Reference > Common > AddDataSeries()

                  Any calls to AddDataSeries() done in a hosted symbiote indicator called from a host script must also be done in the hosting strategy or indicator. (Meaning if you call AddDataSeries() from an indicator called by another script, that script calling the indicator needs to have the same AddDataSeries() line called)

                  Series will be synchronized to the primary series. If your intention is to retrieve data when the secondary series is updating, you can synchronize a non-plot-series to a secondary series by supplying the BarsArray[1] object as the bars object and then from the host script call IndicatorName.Update(); during BarsInProgress 1, before retrieving the value from the public series.

                  Help guide: NinjaScript > Language Reference > Common > ISeries<T> > Series<T>
                  Help guide: NinjaScript > Language Reference > Common > OnBarUpdate() > Update()

                  In the symbiote State.DataLoaded:
                  mySecondaryBoolSeries = new Series<bool>(BarsArray[1]);

                  From the host:
                  if (BarsInProgress == 1)
                  {
                  MyIndicatorName().Update();
                  Print(Times[1][0].ToString() + " | " + MyIndicatorName().MySecondaryBoolSeries[0].ToString());
                  }
                  Chelsea B.NinjaTrader Customer Service

                  Comment

                  Latest Posts

                  Collapse

                  Topics Statistics Last Post
                  Started by argusthome, 03-08-2026, 10:06 AM
                  0 responses
                  57 views
                  0 likes
                  Last Post argusthome  
                  Started by NabilKhattabi, 03-06-2026, 11:18 AM
                  0 responses
                  37 views
                  0 likes
                  Last Post NabilKhattabi  
                  Started by Deep42, 03-06-2026, 12:28 AM
                  0 responses
                  18 views
                  0 likes
                  Last Post Deep42
                  by Deep42
                   
                  Started by TheRealMorford, 03-05-2026, 06:15 PM
                  0 responses
                  20 views
                  0 likes
                  Last Post TheRealMorford  
                  Started by Mindset, 02-28-2026, 06:16 AM
                  0 responses
                  49 views
                  0 likes
                  Last Post Mindset
                  by Mindset
                   
                  Working...
                  X