Announcement

Collapse
No announcement yet.

Partner 728x90

Collapse

Power of Three (PO3)

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

    Power of Three (PO3)

    Hi everyone,

    I am looking for a free / paid "Power of Three" (PO3) indicator that can be used with NT8.

    It should be similar to the Trading View "HTF Power of Three" (by toodegrees) indicator which focuses on.

    I would love to know if there is a "Power of Three" NT8 indicator out there OR worst-case scenario if it can be coded?

    Many thanks,
    Michel

    Click image for larger version

Name:	image.png
Views:	252
Size:	58.7 KB
ID:	1335111
    Last edited by michelz; 02-18-2025, 08:33 AM.

    #2
    I do not know of an indicator that looks this cute, but this one gives the same info:

    Indicator that marks the High / Low / median of the previous candle in various time frames. >>>Please ensure you have enough days loaded to view previous levels!


    Comment


      #3
      Originally posted by MiCe1999 View Post
      I do not know of an indicator that looks this cute, but this one gives the same info:

      Indicator that marks the High / Low / median of the previous candle in various time frames. >>>Please ensure you have enough days loaded to view previous levels!

      Thanks! This is helpful.

      Comment


        #4
        Originally posted by michelz View Post

        Thanks! This is helpful.
        Since I had few tokens left for today I asked chatGPT to make a cute candle like in your example. It may not have all the null checks but it should give you an idea what's possible:

        PHP Code:
        #region Using declarations
        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.ComponentModel.DataAnnotations;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using System.Windows;
        using System.Windows.Input;
        using System.Windows.Media;
        using System.Xml.Serialization;
        using NinjaTrader.Cbi;
        using NinjaTrader.Gui;
        using NinjaTrader.Gui.Chart;
        using NinjaTrader.Gui.SuperDom;
        using NinjaTrader.Gui.Tools;
        using NinjaTrader.Data;
        using NinjaTrader.NinjaScript;
        using NinjaTrader.Core.FloatingPoint;
        using NinjaTrader.NinjaScript.DrawingTools;
        #endregion
        
        
        
        
        namespace NinjaTrader.NinjaScript.Indicators
        {
            public class MarginCandlestick : Indicator
            {
                private int barPaintWidth;
                private Dictionary<string, DXMediaMap> dxmBrushes;
                private SharpDX.RectangleF reuseRect;
                private SharpDX.Vector2 reuseVector1, reuseVector2;
                private double lastOpen, lastHigh, lastLow, lastClose;
        
                protected override void OnStateChange()
                {
                    if (State == State.SetDefaults)
                    {
                        Description = "Renders a candlestick in the right margin using secondary timeframe data";
                        Name = "MarginCandlestick";
                        Calculate = Calculate.OnPriceChange;  // Changed from OnBarClose
                        IsOverlay = true;
                        DisplayInDataBox = true;
                        DrawOnPricePanel = true;
                        IsSuspendedWhileInactive = true;
                        
                        Period = 1; // Default 1 minute
                        
                        dxmBrushes = new Dictionary<string, DXMediaMap>();
                        foreach (string brushName in new string[] { "barColorDown", "barColorUp", "shadowColor" })
                            dxmBrushes.Add(brushName, new DXMediaMap());
                        
                        BarColorDown = Brushes.Red;
                        BarColorUp = Brushes.Lime;
                        ShadowColor = (Application.Current.TryFindResource("ChartControl.AxisPen") as Pen).Brush;
                        ShadowWidth = 1;
                    }
                    else if (State == State.Configure)
                    {
                        // Add secondary data series
                        AddDataSeries(BarsPeriodType.Minute, Period);
                    }
                }
        
        protected override void OnBarUpdate()
        {
            try
            {
                if (BarsInProgress != 1)
                    return;
        
                if (CurrentBars[0] < 0 || CurrentBars[1] < 0 || BarsArray[1].Count <= 0)
                    return;
        
                // Get current candle data using [0][0]
                lastOpen = Opens[1][0];
                lastHigh = Highs[1][0];
                lastLow = Lows[1][0];
                lastClose = Closes[1][0];
        
                // Debug output
                
                //Print($"Current Candle - O: {lastOpen}, H: {lastHigh}, L: {lastLow}, C: {lastClose}");
            }
            catch (Exception ex)
            {
                Print($"MarginCandlestick OnBarUpdate Error: {ex.Message}");
            }
        }
        
                protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
                {
                    if (RenderTarget == null || chartControl == null || chartScale == null)
                        return;
        
                    barPaintWidth = Math.Max(6, 1 + 2 * ((int)ChartBars.Properties.ChartStyle.BarWidth - 1) + 2 * ShadowWidth);
        
                    // Calculate x position in margin
                    int x = chartControl.CanvasRight - 40;
        
                    // Get y-coordinates using stored secondary series data
                    int y1 = chartScale.GetYByValue(lastOpen);
                    int y2 = chartScale.GetYByValue(lastHigh);
                    int y3 = chartScale.GetYByValue(lastLow);
                    int y4 = chartScale.GetYByValue(lastClose);
        
                    // Draw shadow line
                    reuseVector1.X = x;
                    reuseVector1.Y = y2;
                    reuseVector2.X = x;
                    reuseVector2.Y = y3;
                    RenderTarget.DrawLine(reuseVector1, reuseVector2, dxmBrushes["shadowColor"].DxBrush);
        
                    // Draw body
                    if (lastClose == lastOpen)
                    {
                        // Draw horizontal line for doji
                        reuseVector1.X = (x - barPaintWidth / 2);
                        reuseVector1.Y = y1;
                        reuseVector2.X = (x + barPaintWidth / 2);
                        reuseVector2.Y = y1;
                        RenderTarget.DrawLine(reuseVector1, reuseVector2, dxmBrushes["shadowColor"].DxBrush);
                    }
                    else
                    {
                        // Draw candlestick body
                        if (lastClose > lastOpen)
                        {
                            UpdateRect(ref reuseRect, (x - barPaintWidth / 2), y4, barPaintWidth, (y1 - y4));
                            RenderTarget.FillRectangle(reuseRect, dxmBrushes["barColorUp"].DxBrush);
                        }
                        else
                        {
                            UpdateRect(ref reuseRect, (x - barPaintWidth / 2), y1, barPaintWidth, (y4 - y1));
                            RenderTarget.FillRectangle(reuseRect, dxmBrushes["barColorDown"].DxBrush);
                        }
        
                        // Draw border
                        UpdateRect(ref reuseRect, ((x - barPaintWidth / 2) + (ShadowWidth / 2)), Math.Min(y4, y1),
                            (barPaintWidth - ShadowWidth + 2), Math.Abs(y4 - y1));
                        RenderTarget.DrawRectangle(reuseRect, dxmBrushes["shadowColor"].DxBrush);
                    }
                }
        
                public override void OnRenderTargetChanged()
                {      
                    try
                    {
                        foreach (KeyValuePair<string, DXMediaMap> item in dxmBrushes)
                        {
                            if (item.Value.DxBrush != null)
                                item.Value.DxBrush.Dispose();
        
                            if (RenderTarget != null)
                                item.Value.DxBrush = item.Value.MediaBrush.ToDxBrush(RenderTarget);                
                        }
                    }
                    catch (Exception exception)
                    {
                        Print($"MarginCandlestick OnRenderTargetChanged Error: {exception.Message}");
                    }
                }
        
                private void UpdateRect(ref SharpDX.RectangleF rectangle, float x, float y, float width, float height)
                {
                    rectangle.X = x;
                    rectangle.Y = y;
                    rectangle.Width = width;
                    rectangle.Height = height;
                }
        
                #region Properties
                [Browsable(false)]
                public class DXMediaMap
                {
                    public SharpDX.Direct2D1.Brush DxBrush;
                    public System.Windows.Media.Brush MediaBrush;
                }
        
                [NinjaScriptProperty]
                [Range(1, int.MaxValue)]
                [Display(Name="Period (Minutes)", Order=1, GroupName="Parameters")]
                public int Period
                { get; set; }
        
                [NinjaScriptProperty]
                [XmlIgnore]
                [Display(Name="BarColorDown", Order=2, GroupName="Parameters")]
                public Brush BarColorDown
                {
                    get { return dxmBrushes["barColorDown"].MediaBrush; }
                    set { dxmBrushes["barColorDown"].MediaBrush = value; }
                }
        
                [Browsable(false)]
                public string BarColorDownSerializable
                {
                    get { return Serialize.BrushToString(BarColorDown); }
                    set { BarColorDown = Serialize.StringToBrush(value); }
                }
        
                [NinjaScriptProperty]
                [XmlIgnore]
                [Display(Name="BarColorUp", Order=3, GroupName="Parameters")]
                public Brush BarColorUp
                {
                    get { return dxmBrushes["barColorUp"].MediaBrush; }
                    set { dxmBrushes["barColorUp"].MediaBrush = value; }
                }
        
                [Browsable(false)]
                public string BarColorUpSerializable
                {
                    get { return Serialize.BrushToString(BarColorUp); }
                    set { BarColorUp = Serialize.StringToBrush(value); }
                }
        
                [NinjaScriptProperty]
                [XmlIgnore]
                [Display(Name="ShadowColor", Order=4, GroupName="Parameters")]
                public Brush ShadowColor
                {
                    get { return dxmBrushes["shadowColor"].MediaBrush; }
                    set { dxmBrushes["shadowColor"].MediaBrush = value; }
                }
        
                [Browsable(false)]
                public string ShadowColorSerializable
                {
                    get { return Serialize.BrushToString(ShadowColor); }
                    set { ShadowColor = Serialize.StringToBrush(value); }
                }
        
                [NinjaScriptProperty]
                [Range(1, int.MaxValue)]
                [Display(Name="ShadowWidth", Order=5, GroupName="Parameters")]
                public int ShadowWidth
                { get; set; }
                #endregion
            }
        }&#8203; 
        
        Click image for larger version

Name:	image.png
Views:	264
Size:	14.8 KB
ID:	1335233

        Comment


          #5
          Originally posted by MiCe1999 View Post

          Since I had few tokens left for today I asked chatGPT to make a cute candle like in your example. It may not have all the null checks but it should give you an idea what's possible:

          PHP Code:
          #region Using declarations
          using System;
          using System.Collections.Generic;
          using System.ComponentModel;
          using System.ComponentModel.DataAnnotations;
          using System.Linq;
          using System.Text;
          using System.Threading.Tasks;
          using System.Windows;
          using System.Windows.Input;
          using System.Windows.Media;
          using System.Xml.Serialization;
          using NinjaTrader.Cbi;
          using NinjaTrader.Gui;
          using NinjaTrader.Gui.Chart;
          using NinjaTrader.Gui.SuperDom;
          using NinjaTrader.Gui.Tools;
          using NinjaTrader.Data;
          using NinjaTrader.NinjaScript;
          using NinjaTrader.Core.FloatingPoint;
          using NinjaTrader.NinjaScript.DrawingTools;
          #endregion
          
          
          
          
          namespace NinjaTrader.NinjaScript.Indicators
          {
          public class MarginCandlestick : Indicator
          {
          private int barPaintWidth;
          private Dictionary<string, DXMediaMap> dxmBrushes;
          private SharpDX.RectangleF reuseRect;
          private SharpDX.Vector2 reuseVector1, reuseVector2;
          private double lastOpen, lastHigh, lastLow, lastClose;
          
          protected override void OnStateChange()
          {
          if (State == State.SetDefaults)
          {
          Description = "Renders a candlestick in the right margin using secondary timeframe data";
          Name = "MarginCandlestick";
          Calculate = Calculate.OnPriceChange; // Changed from OnBarClose
          IsOverlay = true;
          DisplayInDataBox = true;
          DrawOnPricePanel = true;
          IsSuspendedWhileInactive = true;
          
          Period = 1; // Default 1 minute
          
          dxmBrushes = new Dictionary<string, DXMediaMap>();
          foreach (string brushName in new string[] { "barColorDown", "barColorUp", "shadowColor" })
          dxmBrushes.Add(brushName, new DXMediaMap());
          
          BarColorDown = Brushes.Red;
          BarColorUp = Brushes.Lime;
          ShadowColor = (Application.Current.TryFindResource("ChartControl.AxisPen") as Pen).Brush;
          ShadowWidth = 1;
          }
          else if (State == State.Configure)
          {
          // Add secondary data series
          AddDataSeries(BarsPeriodType.Minute, Period);
          }
          }
          
          protected override void OnBarUpdate()
          {
          try
          {
          if (BarsInProgress != 1)
          return;
          
          if (CurrentBars[0] < 0 || CurrentBars[1] < 0 || BarsArray[1].Count <= 0)
          return;
          
          // Get current candle data using [0][0]
          lastOpen = Opens[1][0];
          lastHigh = Highs[1][0];
          lastLow = Lows[1][0];
          lastClose = Closes[1][0];
          
          // Debug output
          
          //Print($"Current Candle - O: {lastOpen}, H: {lastHigh}, L: {lastLow}, C: {lastClose}");
          }
          catch (Exception ex)
          {
          Print($"MarginCandlestick OnBarUpdate Error: {ex.Message}");
          }
          }
          
          protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
          {
          if (RenderTarget == null || chartControl == null || chartScale == null)
          return;
          
          barPaintWidth = Math.Max(6, 1 + 2 * ((int)ChartBars.Properties.ChartStyle.BarWidth - 1) + 2 * ShadowWidth);
          
          // Calculate x position in margin
          int x = chartControl.CanvasRight - 40;
          
          // Get y-coordinates using stored secondary series data
          int y1 = chartScale.GetYByValue(lastOpen);
          int y2 = chartScale.GetYByValue(lastHigh);
          int y3 = chartScale.GetYByValue(lastLow);
          int y4 = chartScale.GetYByValue(lastClose);
          
          // Draw shadow line
          reuseVector1.X = x;
          reuseVector1.Y = y2;
          reuseVector2.X = x;
          reuseVector2.Y = y3;
          RenderTarget.DrawLine(reuseVector1, reuseVector2, dxmBrushes["shadowColor"].DxBrush);
          
          // Draw body
          if (lastClose == lastOpen)
          {
          // Draw horizontal line for doji
          reuseVector1.X = (x - barPaintWidth / 2);
          reuseVector1.Y = y1;
          reuseVector2.X = (x + barPaintWidth / 2);
          reuseVector2.Y = y1;
          RenderTarget.DrawLine(reuseVector1, reuseVector2, dxmBrushes["shadowColor"].DxBrush);
          }
          else
          {
          // Draw candlestick body
          if (lastClose > lastOpen)
          {
          UpdateRect(ref reuseRect, (x - barPaintWidth / 2), y4, barPaintWidth, (y1 - y4));
          RenderTarget.FillRectangle(reuseRect, dxmBrushes["barColorUp"].DxBrush);
          }
          else
          {
          UpdateRect(ref reuseRect, (x - barPaintWidth / 2), y1, barPaintWidth, (y4 - y1));
          RenderTarget.FillRectangle(reuseRect, dxmBrushes["barColorDown"].DxBrush);
          }
          
          // Draw border
          UpdateRect(ref reuseRect, ((x - barPaintWidth / 2) + (ShadowWidth / 2)), Math.Min(y4, y1),
          (barPaintWidth - ShadowWidth + 2), Math.Abs(y4 - y1));
          RenderTarget.DrawRectangle(reuseRect, dxmBrushes["shadowColor"].DxBrush);
          }
          }
          
          public override void OnRenderTargetChanged()
          {
          try
          {
          foreach (KeyValuePair<string, DXMediaMap> item in dxmBrushes)
          {
          if (item.Value.DxBrush != null)
          item.Value.DxBrush.Dispose();
          
          if (RenderTarget != null)
          item.Value.DxBrush = item.Value.MediaBrush.ToDxBrush(RenderTarget);
          }
          }
          catch (Exception exception)
          {
          Print($"MarginCandlestick OnRenderTargetChanged Error: {exception.Message}");
          }
          }
          
          private void UpdateRect(ref SharpDX.RectangleF rectangle, float x, float y, float width, float height)
          {
          rectangle.X = x;
          rectangle.Y = y;
          rectangle.Width = width;
          rectangle.Height = height;
          }
          
          #region Properties
          [Browsable(false)]
          public class DXMediaMap
          {
          public SharpDX.Direct2D1.Brush DxBrush;
          public System.Windows.Media.Brush MediaBrush;
          }
          
          [NinjaScriptProperty]
          [Range(1, int.MaxValue)]
          [Display(Name="Period (Minutes)", Order=1, GroupName="Parameters")]
          public int Period
          { get; set; }
          
          [NinjaScriptProperty]
          [XmlIgnore]
          [Display(Name="BarColorDown", Order=2, GroupName="Parameters")]
          public Brush BarColorDown
          {
          get { return dxmBrushes["barColorDown"].MediaBrush; }
          set { dxmBrushes["barColorDown"].MediaBrush = value; }
          }
          
          [Browsable(false)]
          public string BarColorDownSerializable
          {
          get { return Serialize.BrushToString(BarColorDown); }
          set { BarColorDown = Serialize.StringToBrush(value); }
          }
          
          [NinjaScriptProperty]
          [XmlIgnore]
          [Display(Name="BarColorUp", Order=3, GroupName="Parameters")]
          public Brush BarColorUp
          {
          get { return dxmBrushes["barColorUp"].MediaBrush; }
          set { dxmBrushes["barColorUp"].MediaBrush = value; }
          }
          
          [Browsable(false)]
          public string BarColorUpSerializable
          {
          get { return Serialize.BrushToString(BarColorUp); }
          set { BarColorUp = Serialize.StringToBrush(value); }
          }
          
          [NinjaScriptProperty]
          [XmlIgnore]
          [Display(Name="ShadowColor", Order=4, GroupName="Parameters")]
          public Brush ShadowColor
          {
          get { return dxmBrushes["shadowColor"].MediaBrush; }
          set { dxmBrushes["shadowColor"].MediaBrush = value; }
          }
          
          [Browsable(false)]
          public string ShadowColorSerializable
          {
          get { return Serialize.BrushToString(ShadowColor); }
          set { ShadowColor = Serialize.StringToBrush(value); }
          }
          
          [NinjaScriptProperty]
          [Range(1, int.MaxValue)]
          [Display(Name="ShadowWidth", Order=5, GroupName="Parameters")]
          public int ShadowWidth
          { get; set; }
          #endregion
          }
          }&#8203; 
          
          Click image for larger version

Name:	image.png
Views:	264
Size:	14.8 KB
ID:	1335233
          Amazing. By the way, the candle displayed within my screenshot is a 4H candle. Thanks!

          Comment


            #6
            Ah, higher time frames is what I should be looking at more often. You can use 240 minutes for the period to get 4H candle, however if you're going as big as 4H - volume profile is probably better to look at. I think this type of indicator could use one or two preceding candles as well.
            Last edited by MiCe1999; 02-19-2025, 11:06 AM.

            Comment


              #7
              I attempted to make one too. You can change the colors or the wicks, outline for Up/Down candles, the fill color of those candles, and the ability to choose a bar type and a period. You can also choose not to display the value text on the side....


              *Edit*
              Added Displays to show the Bar type and period above, and a timer for the higher time frame below. There are also boolean you can uncheck if you don't want them displayed, but are on by default.

              Changed some of the formatting so the text and HTF candle centers nicely. Also moved the Open and Low texts to the left side of the candle so they no longer overlap each other.

              Fixed more centering issues.

              Fixed overlapping issue when displaying price. I didn't check to see it worked with green candles, so I fixed some of the logic and it works now.

              Fixed some Properties window formatting and descriptions.

              Added a check to ensure that the secondary is a Higher time frame.
              The Secondary time frame can be either "Second", "Minute" or "Day" time frames.
              If the Secondary time frame chosen is lower than the Primary time frame, or the Primary time frame is not either "Second", "Minute" or "Day" time frames, the indicator will default to the Primary data series data.

              Download from the User App Share here: https://ninjatraderecosystem.com/use...-of-three-po3/
              Last edited by rockmanx00; 02-25-2025, 10:22 AM.

              Comment


                #8
                Originally posted by rockmanx00 View Post
                I attempted to make one too. You can change the colors or the wicks, outline for Up/Down candles, the fill color of those candles, and the ability to choose a bar type and a period. You can also choose not to display the value text on the side....
                Thanks for sharing. Clean code, AI has still much to learn.. Have you thought of adding a countdown timer?

                Comment


                  #9
                  I haven't thought of that. I could look into figuring out how to add that. I suppose if I were to add that, I could add the bar type and period above the candle, and place the time below so you know what higher time frame candle you are using and how much time for that particular time frame is left...Good idea.

                  Comment


                    #10
                    Not exactly the same thing, but I wrote an indicator that overlays the range of higher timeframe candles over the current price. Candle bodies are shown in color, the wicks are shown in gray. In this example, these are 15 minute candles overlaid on a 1 minute chart.

                    Click image for larger version

Name:	image.png
Views:	238
Size:	22.2 KB
ID:	1335284

                    Comment


                      #11
                      Nice. I bought something that almost does the same thing. I think it didn't quite overlay as nicely though, was off slightly so I never used it. Pretty sure I paid about $100 or so for it. Good job.

                      Comment


                        #12
                        Originally posted by rockmanx00 View Post
                        I attempted to make one too. You can change the colors or the wicks, outline for Up/Down candles, the fill color of those candles, and the ability to choose a bar type and a period. You can also choose not to display the value text on the side....


                        *Edit*
                        Added Displays to show the Bar type and period above, and a timer for the higher time frame below. There are also boolean you can uncheck if you don't want them displayed, but are on by default.

                        Changed some of the formatting so the text and HTF candle centers nicely. Also moved the Open and Low texts to the left side of the candle so they no longer overlap each other.

                        Fixed more centering issues.

                        Fixed overlapping issue when displaying price. I didn't check to see it worked with green candles, so I fixed some of the logic and it works now.

                        Fixed some Properties window formatting and descriptions.
                        Awesome. Would you mind explaining if you are running the timer on UI thread so it updates outside of onbarupdate interval? Wouldn't it also force refresh of the whole chart and slow down NT? I think I've seen similar construct to speed up chart refresh.

                        I could be wrong, but I remember having issue with using system time (now) is that it could be out of sync with bar time. I think getting time from Times[0][0] may be more accurate. Or, compare Times[0][0] to system time, from time to time, and calculate clock drift.
                        Last edited by MiCe1999; 02-20-2025, 10:02 AM.

                        Comment


                          #13
                          For the timer, I pretty much copied logic from the bar timer that came with ninjatrader so if that doesn't slow things down for you, this shouldn't either. It does force refresh and I haven't noticed any slow downs on my end. Also, as you can see, I've been updating it a lot. I've been using it and noticed small things here and there that bug me about it, so I tend to upgrade it frequently. If you notice anything buggy about it, please feel free to let me know so I get work on it. I've tried to set the HTF bar to a 38 minute bar, and that still works.

                          Comment


                            #14
                            Originally posted by rockmanx00 View Post
                            For the timer, I pretty much copied logic from the bar timer that came with ninjatrader so if that doesn't slow things down for you, this shouldn't either. It does force refresh and I haven't noticed any slow downs on my end. Also, as you can see, I've been updating it a lot. I've been using it and noticed small things here and there that bug me about it, so I tend to upgrade it frequently. If you notice anything buggy about it, please feel free to let me know so I get work on it. I've tried to set the HTF bar to a 38 minute bar, and that still works.
                            Thanks again. I figured out how to get our candle to draw where it starts on the primary. It's probably useful for short time frames only.

                            ​​


                            PHP Code:
                            private int GetCurrentHTFStartBarIndex()
                            {
                            
                              
                                // add return if secondary bar still the same
                              
                                // Start from most recent bar and walk forward in time
                                int currentBar = 0; // our index
                                
                                // Get HTF time - using index 1 since bars have close timestamp
                                long htfTicks = Times[1][1].Ticks;
                                //Print($"HTF Time: {Times[1][1]}");
                                
                                //Print($"Starting search from primary bar: {currentBar+1}");
                                
                                // Walk backward until we find the bar belonging to previous HTF period
                                while(currentBar < CurrentBars[0])
                                {
                                    // Check next bar's time
                                    if(Times[0][currentBar + 1].Ticks < htfTicks)
                                    {
                                        //Print($"Found HTF period start at primary bar: {currentBar}");
                                        //Print($"Start bar time: {Times[0][currentBar]}");
                                        break;
                                    }
                                    
                                    currentBar++;
                                }
                                
                                return CurrentBars[0]-currentBar;
                            }&#8203; 
                            

                            Comment


                              #15
                              is this po3 indicator available to download? also looking for something like t00 degrees for nt8

                              Comment

                              Latest Posts

                              Collapse

                              Topics Statistics Last Post
                              Started by TrippTraders, Yesterday, 07:14 PM
                              1 response
                              12 views
                              0 likes
                              Last Post brucerobinson  
                              Started by decosenty, Yesterday, 11:33 PM
                              0 responses
                              9 views
                              0 likes
                              Last Post decosenty  
                              Started by RicharBarrio, Yesterday, 11:26 PM
                              0 responses
                              7 views
                              0 likes
                              Last Post RicharBarrio  
                              Started by paulo_br, 09-13-2024, 08:41 AM
                              8 responses
                              1,155 views
                              0 likes
                              Last Post AppleID25  
                              Started by mno_om, Yesterday, 08:44 PM
                              0 responses
                              11 views
                              0 likes
                              Last Post mno_om
                              by mno_om
                               
                              Working...
                              X