Announcement

Collapse
No announcement yet.

Partner 728x90

Collapse

How to mark the date and time an event happened when running a custom indicator?

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

    How to mark the date and time an event happened when running a custom indicator?

    Hello

    Having as base the indicator Position Display Indicator:
    This indicator provides a customizable text box which displays a position’s UnRealized PnL, Realized PnL of a selected account, and the overall cash value of the account.


    I'm making it some customizations to calculate the lower Unrealized Account Balance value that if reached then it means the trading strategy has failed. Lower Unrealized Account Balance value = lower Net Liquidation value.

    Now what I need is that if this event happens, then that the indicator put a mark of this event:
    - Displaying in red color the date and exact time (hh:mm:ss) it has happened.
    - If possible and for better visual illustration, that in addition to the previous, that the indicator also draws a vertical time line in red color showing the moment the event took place.

    I need a guide about how to add these 2 features to the indicator.

    I need this works either in Live, in Demo, in Simulated or in Playback (Market Replay), but knowing the playback could be in a high running speed and I'm not sure if an indicator can make its calculations tick-by-tick or at least change-by-change or at least second-by-second when the playback speed is in 500x or Max speed, I'm not sure if a indicator can read any change between time-by-time when the playback process is for example in 1,000x, or if it just is able to work with the current time after any run time change, for example if the time jumps form 10 minutes to 10 minutes, I’m not sure if the indicators can read the changes that happened into every 10 minutes jump.

    Thank you

    #2
    Hello futurenow,

    Thank you for your post.

    To clarify, are you looking to draw the display of the date and time this occurred on the chart above the bar on which it happens and then also draw a vertical red line on that bar as well?

    For that, I'd recommend using Draw.Text to display the Time[0] of a single tick series when the event you wish occurs and Draw.VerticalLine() to draw a line on the current bar:




    Playback runs at a 1 second update granularity so you could display that to the nearest second. Accelerating playback should still work fine for adding the text and lines.

    Please let us know if we may be of further assistance to you.

    Comment


      #3
      Originally posted by NinjaTrader_Kate View Post
      Hello futurenow,

      To clarify, are you looking to draw the display of the date and time this occurred on the chart above the bar on which it happens and then also draw a vertical red line on that bar as well?
      Thank you for the answer.

      Yes, this want I need, to show in the predefined textbox Position Display Indicator have by defualt, displaying in a chart the time-and-date information the failing event happened and also draw a red line in the exact time the event happened for a visual help purpose.

      For that, I'd recommend using Draw.Text to display the Time[0] of a single tick series when the event you wish occurs and Draw.VerticalLine() to draw a line on the current bar:

      https://ninjatrader.com/support/help.../draw_text.htm
      https://ninjatrader.com/support/help...rticalline.htm
      Yes, thank you, I had seen Position Display Indicator use for example the next kind of code to draw what you need to show in a textbox in a chart:
      Code:
      DrawTextLayout(RenderTarget, ChartPanel, ChartPanel.X + HorizontalOffset, ChartPanel.Y + VerticalOffset, unRealizedPnLstring, Font, unRealizedPnL < 0 ? negativeBrush : positiveBrush);
      I've using that, but the situation I'm asking for is not mainly about how to draw the time/date, the main I need to know is how I get the time-and-date when the event happened, to then take that information and display it in screen.


      For example, let's suppose a starting account balance = $1,000.00, and you have the rule that if the account balance < or = $500, either with the account unrealized balance or with the account realized balance, then it means your strategy failed to meet the minimum necessary requirements. So what I need to know is how I can get the time-and-date when the example event happens, i.e. when the account have a net liquidation < or = $500, to then draw this information in the screen, also drawing a reference vertical time line of the event.

      Could you please complete, or re-write the portion of code in an efficient way if you consider, to get the date and the time of the example I just wrote.

      Code:
      [COLOR=#7f8c8d]//simplified code portion[/COLOR]
      private double NetLiquidation;
      private double FailureLevel = 500;
      private double time_n_date_FailureLevel;  //at the moment to write this I didn't confirm if the time/date can be setted as 'double' variable
      
      if (NetLiquidation <= FailureLevel)
      {
      [COLOR=#7f8c8d]//pseudocode:[/COLOR]
      [B]time_n_date_FailureLevel = [COLOR=#e67e22]code_to_get_time_of_the_event[/COLOR][/B];
      }
      
      string time_n_date_FailureLevelstring = time_n_date_FailureLevel.ToString("N2");
      
      DrawTextLayout(RenderTarget, ChartPanel, ChartPanel.X + HorizontalOffset, ChartPanel.Y + VerticalOffset, time_n_date_FailureLevelstring, Font, unRealizedPnL < 0 ? negativeBrush : positiveBrush);

      Playback runs at a 1 second update granularity so you could display that to the nearest second. Accelerating playback should still work fine for adding the text and lines.
      If the Playback runs the Market Replay at 1 second update then perfect, because I can obtain the time of the event with 1 second of maximum inaccuracy time distortion, either the Market Replay speed be at 1x or at 100x or at Max speed

      Thank you

      Comment


        #4
        Oh, I forgot to specify a very important detail, and it is that for Live, Demo, Simulated accounts the date and time I need to be displayed is the real-time calendar date and time, as the normal, but about the Playback the thing is different, what it is needed is the event's date and time of the Market Replay moment, i.e. not the date and time in the computer for these cases.

        For example, if today Feb 20, 2021 you are running the Market Replay of Nov 30, 2020 and the failure event happens at 11:05:42 am (on Nov 30, 2020) then I need the indicator displays something like:

        The strategy failed to meet the minimum necessary requirements at 11:05:42 am, on Nov 30, 2020

        Comment


          #5
          Hello futurenow,

          Thank you for your replies.

          What I would suggest would be pretty much the same as my previous reply - add a 1 tick data series of the same instrument, then in OnBarUpdate, put your code for assessing the current state of the strategy within a check for that data series.

          So, something like this:

          Code:
           protected override void OnStateChange()
          {
          if (State == State.SetDefaults)
          {
          Description = NinjaTrader.Custom.Resource.NinjaScriptStrategyDes criptionSampleMACrossOver;
          Name = "ExamplePrintTimeSecondarySeries";
          // This strategy has been designed to take advantage of performance gains in Strategy Analyzer optimizations
          // See the Help Guide for additional information
          IsInstantiatedOnEachOptimizationIteration = false;
          }
          else if (State == State.Configure)
          {
          AddDataSeries(null, BarsPeriodType.Tick, 1);
          }
          
          }
          
          protected override void OnBarUpdate()
          {
          if (CurrentBars[0] < BarsRequiredToTrade)
          return;
          
          if(BarsInProgress == 0)
          {
          // anything you want to process on the primary series goes in here
          }
          else if (BarsInProgress == 1)
          {
          
          //simplified code portion
          private double NetLiquidation;
          private double FailureLevel = 500;
          private DateTime time_n_date_FailureLevel; // you can't assign time to a double, you would need a DateTime variable
          
          if (NetLiquidation <= FailureLevel)
          {
          //pseudocode:
          time_n_date_FailureLevel = Times[1][0];
          }
          
          string time_n_date_FailureLevelstring = time_n_date_FailureLevel.ToString("N2");
          
          DrawTextLayout(RenderTarget, ChartPanel, ChartPanel.X + HorizontalOffset, ChartPanel.Y + VerticalOffset, time_n_date_FailureLevelstring, Font, unRealizedPnL < 0 ? negativeBrush : positiveBrush);
          
          }
          }
          Note I haven't done any corrections on your code snippet other than changing the double for the time to a DateTime, but you should get the general idea of what would need to be done from this.

          Please let us know if we may be of further assistance to you.

          Comment


            #6
            Originally posted by NinjaTrader_Kate View Post
            What I would suggest would be pretty much the same as my previous reply - add a 1 tick data series of the same instrument, then in OnBarUpdate, put your code for assessing the current state of the strategy within a check for that data series.

            So, something like this:

            Code:
             protected override void OnStateChange()
            {
            if (State == State.SetDefaults)
            {
            Description = NinjaTrader.Custom.Resource.NinjaScriptStrategyDes criptionSampleMACrossOver;
            Name = "ExamplePrintTimeSecondarySeries";
            // This strategy has been designed to take advantage of performance gains in Strategy Analyzer optimizations
            // See the Help Guide for additional information
            IsInstantiatedOnEachOptimizationIteration = false;
            }
            else if (State == State.Configure)
            {
            AddDataSeries(null, BarsPeriodType.Tick, 1);
            }
            
            }
            
            protected override void OnBarUpdate()
            {
            if (CurrentBars[0] &lt; BarsRequiredToTrade)
            return;
            
            if(BarsInProgress == 0)
            {
            // anything you want to process on the primary series goes in here
            }
            else if (BarsInProgress == 1)
            {
            
            //simplified code portion
            private double NetLiquidation;
            private double FailureLevel = 500;
            private DateTime time_n_date_FailureLevel; // you can't assign time to a double, you would need a DateTime variable
            
            if (NetLiquidation &lt;= FailureLevel)
            {
            //pseudocode:
            time_n_date_FailureLevel = Times[1][0];
            }
            
            string time_n_date_FailureLevelstring = time_n_date_FailureLevel.ToString("N2");
            
            DrawTextLayout(RenderTarget, ChartPanel, ChartPanel.X + HorizontalOffset, ChartPanel.Y + VerticalOffset, time_n_date_FailureLevelstring, Font, unRealizedPnL &lt; 0 ? negativeBrush : positiveBrush);
            
            }
            }
            Note I haven't done any corrections on your code snippet other than changing the double for the time to a DateTime, but you should get the general idea of what would need to be done from this.

            Thank you for your replay Kate

            Today I'm working with a different way to print a specific notification failure message that maybe is more suitable for what I'm looking for, that is printing a big failure notification message directly in the top right corner of a chart using 'Draw.TextFixed()', so outside and independently of the indicator's textbox, like you can see in the next code, but I haven't been able to get the time and date of the event to then print them on chart, I'm stuck in the time and date part, please check the next code:

            Code:
            ...
            private double NetLiquidation;
            private double FailureLevel = 500;         // example of Unrealized Account Balance level that indicates an unsuccessful strategy.
            private time_n_date_ofFailureLevel;      // here you spefied the time and date would need to be a 'DateTime' variable.
            ...
            // I didn't put the lines of code you wrote about "protected override void OnBarUpdate() { if (CurrentBars[0] < BarsRequiredToTrade) return; if(BarsInProgress == 0) {.."  because Ninjascript got errors, so I skipped some lines and I only included the next lines I wrote below into "private void OnAccountItemUpdate(object sender, AccountItemEventArgs e)" already created by default in the [B]Position Display Indicator[/B].
            ...
            private void OnAccountItemUpdate(object sender, AccountItemEventArgs e)
            {
            ...
               if (NetLiquidation <= FailureLevel)
               {
                  time_n_date_ofFailureLevel = Times[1][0];      // I took this line from your previous response
            
                  string time_n_date_ofFailureLevelstring = time_n_date_ofFailureLevel.ToString;
            
                  Draw.TextFixed(this, "tag1", "The strategy failed to meet the minimum necessary requirements:", TextPosition.TopRight);
            
                  Draw.Text(this, "tag2", time_n_date_ofFailureLevelstring, TextPosition.TopRight);     // it would be better to print the time and date next to the end of previous printed text, after "...requirements", but I'm not able to get it working:
               }
            }
            The condition is working well as should, and the fixed text "The strategy failed to meet the minimum necessary requirements:" is being displayed correctly at top right corner in the chart when the condition is met, so that part is working as should, but as you can see, for now, I haven't been able implement the right necessary code to obtain the time and date of this event, when this condition is met, to then take this time and date to go next to the text "The strategy failed to meet the minimum necessary requirements...". I'm trying to add the code I've just written above to the Position Display Indicator, but when I try to compile the code it gets errors in the lines I'm trying to get the time and date, errors like "Cannot convert method group "ToString" to non-delegate type 'string'. Did you intend to invoke the method?" or errors like "no overload for method ''Text" takes 4 arguments", etc.

            Note: I would like to remind that there is a special situation about the time and date that is when we are working in Playback. In those cases the time and date needs to be the time and date of the specific moment of the Market Replay, i.e. in these cases the calendar time and date is not valid because don't make any sense for backtesting purposes, moreover when you put the Market Replay speed to for example something like 100x etc. I don't know (because I've not been able to get any date printed yet) if the next code works to solve this about the time and date of the Playback moment of the event, and if yes, in what specific part of the code this needs to be placed? after variables/constants declarations? into the conditional If where I want to obtain the time-and-date of the event described above? where exactly?:

            Code:
            if (Account.Connection.Options.Name == "Playback Connection")
                Print(NinjaTrader.Cbi.Connection.PlaybackConnection.Now);
            else
                Print(DateTime.Now);
            Last edited by futurenow; 02-25-2021, 05:43 PM.

            Comment


              #7
              Hello futurenow,

              Thank you for your reply.

              Your main issue here is trying to access the value of Times[1][0] outside of OnBarUpdate. I wouldn't recommend using DateTime.Now in scripts since that is the PC clock time and not the timestamp of incoming data. What I would suggest is perhaps checking if your conditions are met within OnAccountItemUpdate and then setting a class level bool that this has been triggered. Then, in OnBarUpdate, when the secondary series is processing (if (BarsInProgress == 1)), check to see if the bool has been triggered on the next tick that comes through and then draw that Times[1][0] value from there. There are issues with trying to use a series like Time outside of OBU since other methods are asynchronous.

              You're also not declaring this as a DateTime in your code:


              private time_n_date_ofFailureLevel;

              should be:


              private DateTime time_n_date_ofFailureLevel;

              Please let us know if we may be of further assistance to you.

              Comment


                #8
                Originally posted by NinjaTrader_Kate View Post
                Your main issue here is trying to access the value of Times[1][0] outside of OnBarUpdate. I wouldn't recommend using DateTime.Now in scripts since that is the PC clock time and not the timestamp of incoming data. What I would suggest is perhaps checking if your conditions are met within OnAccountItemUpdate and then setting a class level bool that this has been triggered. Then, in OnBarUpdate, when the secondary series is processing (if (BarsInProgress == 1)), check to see if the bool has been triggered on the next tick that comes through and then draw that Times[1][0] value from there. There are issues with trying to use a series like Time outside of OBU since other methods are asynchronous.
                One more time, thanks a lot for your help Kate

                This Friday I finally could get displayed on the chart the time and date of the event into my condition, I got it with the way you have shown me, with 'Times[1][0]' now finally into 'OnBarUpdate' and as I see it is more simplified than working with 'DateTime.Now' because with 'Times[1][0]' it get the time of the event in either in Live or in Playback without extra steps needed, so thank you!



                In the other hand, not everthing is completely done yet. The indicator has a printing problems and I'm since last Friday trying all the ways I know to solve it but I haven't been able to get the exact result I need. I need help to solve the next situation I will explain.

                Ok, the main situation is that once the condition is met, the exact time of the event is displayed perfectly as should, and the condition process is working into 'OnBarUpdate', but for some reason, the time of the event (the initial time) doesn't keep fixed as I need and as I think it could be, i.e. once the condition is met for the first time let's image it prints the time 10:43:19, well, what happens is like if every other time the condition is met the indicator auto refresh the previous time, so you can see that if 2 seconds later the condition is still met then the time you will see on chart will be 10:43:21. So you can see in the chart something like 10:43:19, then 10:43:21, then 10:43:22, then 10:43:26, and so on changing every several seconds if the condition is met. So to be clear the indicator is not displaying a list of times, it is replacing the time of the event for a new one every time it confirms the condition is met one more time and this could be useful for some other situation but not for what I actually need, that is only the first initial time the event happened because the idea is if I'm not in front of the monitor in the exact moment the event happens then when some minutes later I be back then to be able to see the exact time of the event, so with what the indicator is actually doing it is almost useless until I can obtain permanetly printed the initial time only, of course until you manually restart the indicator if needed, that it is other different situation

                There is a second displaying problem that is I have 2 notifications to display and they never have to be both displayed at the same time because one replaces the other, for example is not possible a trading strategy be working well and failing, both at the same time, and that's exactly what is happening. I put an initial message notifying "The strategy is working well" that is displayed immediately the indicator starts to work, as should, so until this point no problems. But once the critical condition is met I need a second message to replace the previous message that is the message "The strategy has failed", but what I'm actually obtaining is when the indicator starts it displays "The strategy is working well" and when the critical condition of failure is met what the indicator does is to add the second notification message "The strategy has failed" keeping the previous initial message too. So to be clear, once the critical condition is met the indicator displays both messages instead of replace the first message for the critical message and I don't understand why this is happening if the conditions to display both messages are both mutually exclusive, i.e. once one of them is met, in theory, the new one would have to replace the previous.

                I put below the actual portion of code I'm using but I've tried with many different combinations of 'if +else if', also with 'if + else', also with 'if + an extra if' and always the identical result, the indicator starts showing the initial message as should but once the critical condition is met it adds the other message, showing and keeping both.

                Code:
                ...
                    private double LowerNetLiquidation;
                    private double FailureLevel = 500;
                    private time_n_date_ofFailureLevel;
                
                    static bool checker = true;    // Once I observed the indicator was displaying both messages at the same time I tried adding this 'bool' trying that when the critical condition is met it replace the previous displayed message, but for now is not working, still displayed both messages when the critical condition is met.
                ...
                protected override void OnBarUpdate() // I put 'OnBarUpdate()' right after 'OnAccountItemUpdate(...)', outside of course.
                {
                    if(BarsInProgress == 0)
                    {
                         // I'm leaving this condition empty because for the moment I don't see what could here. I tried once to put the conditions here but didn't work, so empty.
                    }
                    else if(BarsInProgress == 1)
                    {
                        if (checker && LowerNetLiquidation > FailureLevel)) // I tried with '&=' instead of '&&', and I've tried with and without the 'bool' but no positive results with the condition below into the 'else'. The condition in this line is the condition by default that is met immediately the program starts, always, as should, no problems with it.
                        {
                            Draw.TextFixed(this, "Alert1", "The strategy is working well", TextPosition.Center, Brushes.Blue, new NinjaTrader.Gui.Tools.SimpleFont("Arial", 12) { Size = 12, Bold = true }, Brushes.Transparent, Brushes.Transparent, 0);
                        }
                        else // this is the critical condition, once 'LowerNetLiquidation <= FailureLevel', i.e. once 'LowerNetLiquidation > FailureLevel' is not true.
                        // 'LowerNetLiquidation' holds the lower value ever of 'NetLiquidation'.
                        {
                            //checker = false; I have tried multiple different combinations trying to get this working and one of them was trying this line with the 'bool' as false, but it didn't work.
                
                            time_n_date_ofFailureLevel = Times[1][0];
                            string time_n_date_ofFailureLevelstring = time_n_date_ofFailureLevel.ToString(...)
                
                            // This is the most important message that I need once 'LowerNetLiquidation > FailureLevel' is not true this message be permanet printed "forever" until you manually restart the indicator.
                            Draw.TextFixed(this, "Alert2", "The strategy has failed " + time_n_date_ofFailureLevelstring, TextPosition.Center, Brushes.Red, new NinjaTrader.Gui.Tools.SimpleFont("Arial", 12) { Size = 12, Bold = true }, Brushes.Transparent, Brushes.Transparent, 0);
                        }
                
                    }
                }
                ...

                I see the normal is 'OnBarUpdate()' be a kind of loop, in this case working every time 'BarsInProgress == 1' and I don't know if this could be the cause of the 2 printing problems, for the auto-updating time and with the 2 messages displayed at the same time even when the critical condition would have to "auto-disable" the previous condition.

                Please take some minutes to let me know how to solve this. You can change whatever you need in the code for your response, I have any kind of problems with that, so feel free to respond in the best way you consider

                Thank you and have a good day
                Last edited by futurenow; 03-01-2021, 05:55 PM.

                Comment


                  #9
                  After my last reply I would like to write in summary what I need in 2 short paragraph, because I know there is a lot of text above.

                  About the critical condition, what I need is simply get the time when the event of the condition happens, so for me is not useful it keeps in a kind of loop auto-updating the time every time the condition is met.

                  Finally, I need to print the message "The strategy is working well" when the strategy is running as should and to print the message "The strategy has failed" when the strategy has failed, but the most important part here is once the critical condition is met and the message "The strategy has failed" is printed I need it be permanent printed regardless of what happens from then on. So if maybe the initial condition is met, then no changes and still printing "The strategy has failed", so permanent printed until you restart the indicator.

                  Thank you very much for all, I really appreciate your help and your time!




                  ...
                  Update

                  Iwas thinking to make the printing process into 'OnRender(...)' but in other post I see that another Ninja agent specifies something about the default NinjaTrader drawing processes shouldn't be called into 'OnRender()', because 'OnRender()' is for custom drawing processes. I thought that maybe the printing problems I'm getting, with the time auto-updating automatically and about the critical alert message is getting printed together with the default alert message when the critical condition is met, that maybe putting these 'Draw.TextFixed(...)' out of 'OnBarUpdate()' would be a possible solution, but that agent just says the time process should be called precisely into sections like 'OnRender(...)', so I will be waiting for your reply to see if there are important details I'm not taking into consideration.
                  Last edited by futurenow; 03-01-2021, 11:17 AM.

                  Comment


                    #10
                    Hello futurenow,

                    Thank you for your reply.

                    You're seeing two messages printed because you're using different tags for each alert and aren't specifically removing the prior one when the strategy meets the requirements to print the failed message.

                    You can either use the same tag (right now they are tagged "Alert1" and "Alert2", so just use "Alert1" for both instead), or you can remove the prior drawing when the failed message gets triggered using RemoveDrawObject:https://ninjatrader.com/support/help...drawobject.htm

                    For the time continuing to update, we'd expect that to occur unless you create a bool, for example, bool FailureReached = false, then when you check that it has been reached, check that the bool is false and that your failure conditions have been met. Then, set the bool to true after you've updated the time of the failure, so it will only update the one time. You can then decide in your logic when to reset the bool again.

                    Please let us know if we may be of further assistance to you.

                    Comment


                      #11
                      Originally posted by NinjaTrader_Kate View Post
                      You're seeing two messages printed because you're using different tags for each alert and aren't specifically removing the prior one when the strategy meets the requirements to print the failed message.

                      You can either use the same tag (right now they are tagged "Alert1" and "Alert2", so just use "Alert1" for both instead), or you can remove the prior drawing when the failed message gets triggered using RemoveDrawObject:https://ninjatrader.com/support/help...drawobject.htm
                      Thank you Kate, the issue was solved with this simple solution you provided about the tags.

                      For the time continuing to update, we'd expect that to occur unless you create a bool, for example, bool FailureReached = false, then when you check that it has been reached, check that the bool is false and that your failure conditions have been met. Then, set the bool to true after you've updated the time of the failure, so it will only update the one time. You can then decide in your logic when to reset the bool again.
                      Also thank you for this. I used a bool as described, as a kind of switch and it worked perfectly



                      In the other hand, I'm looking to present the printed values in a table instead of a list, in order to have more organization, better presentation and approach the space better. Please see the attached picture below, I would like to present the values in a similar way, in a table or board with columns and rows to indicate what value I want to put in any specific cell.

                      Could you please ask to the developer team maybe for an indicator or code portion that does something similar in order to start to work with that code as a base.Click image for larger version

Name:	NT8 Chart with custom table.PNG
Views:	410
Size:	191.3 KB
ID:	1145614

                      Comment


                        #12
                        Hello futurenow,

                        Thank you for your reply.

                        The simplest way would likely be to use add-on code and WPF modifications to create a grid which you can then update with your values. Here's a link to a prior post that demonstrates a number of WPF modifications to the chart window that you could use as a jumping off point:

                        Hello All, Moving forward this will be maintained in the help guide reference samples and no longer maintained on the forum. Creating Chart WPF (UI) Modifications from an Indicator - https://ninjatrader.com/support/help...ui)-modifi.htm (https://ninjatrader.com/support/helpGuides/nt8/creating-chart-wpf-(ui)-modifi.htm) I've


                        Otherwise, you could use custom rendering to create a grid in the indicator panel and update your values in your custom rendered grid. I don't have an example of this, however, Sample Custom Render is a built in indicator that you could review to get some ideas.

                        Please let us know if we may be of further assistance to you.

                        Comment

                        Latest Posts

                        Collapse

                        Topics Statistics Last Post
                        Started by Geovanny Suaza, 02-11-2026, 06:32 PM
                        0 responses
                        600 views
                        0 likes
                        Last Post Geovanny Suaza  
                        Started by Geovanny Suaza, 02-11-2026, 05:51 PM
                        0 responses
                        346 views
                        1 like
                        Last Post Geovanny Suaza  
                        Started by Mindset, 02-09-2026, 11:44 AM
                        0 responses
                        103 views
                        0 likes
                        Last Post Mindset
                        by Mindset
                         
                        Started by Geovanny Suaza, 02-02-2026, 12:30 PM
                        0 responses
                        558 views
                        1 like
                        Last Post Geovanny Suaza  
                        Started by RFrosty, 01-28-2026, 06:49 PM
                        0 responses
                        558 views
                        1 like
                        Last Post RFrosty
                        by RFrosty
                         
                        Working...
                        X