Announcement

Collapse

Looking for a User App or Add-On built by the NinjaTrader community?

Visit NinjaTrader EcoSystem and our free User App Share!

Have a question for the NinjaScript developer community? Open a new thread in our NinjaScript File Sharing Discussion Forum!
See more
See less

Partner 728x90

Collapse

SetStopLoss in Live Account Error

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

    #16
    Thank you for your note,

    I will try it next week in Live. This week I achieved already the weekly profit.
    I think I will change the code as following:

    Code:
     else if (State == State.Configure)
    {
    if(UseTrailStop)
    SetTrailStop(CalculationMode.Ticks, StopLossValue);
    }
    and nothing else.

    Currently I use the trailing like this:

    else if (State == State.Configure)

    Code:
    {
    if(UseTrailStop)
    SetTrailStop(@"ShortA", CalculationMode.Ticks, StopLoss, false);
    }
    .....OnBarUpdate()

    Code:
     ///Reset Trailing , SHORTS
    
    if (Position.MarketPosition == MarketPosition.Flat)
    {
    if(UseTrailStop)
    SetTrailStop(@"ShortA", CalculationMode.Ticks, StopLoss, false);
    }
    I think it should work without issues (messages)... Copied from the strategy : https://ninjatraderecosystem.com/use...-strategy-nt8/

    Best Regards

    Bernard

    Attached Files

    Comment


      #17
      Hello!,

      I am stuck with this issue As I said the strategy only send annoying warnings when the strategy is trailing with the standard NT trailing.
      I have replicated and attached again how I use it in Live. Some light in this it will be apreciated.
      The strange is that in Sim all works without issues.

      Many Thanks in advance

      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.Indicators;
      using NinjaTrader.NinjaScript.DrawingTools;
      #endregion
      
      //This namespace holds Strategies in this folder and is required. Do not change it.
      namespace NinjaTrader.NinjaScript.Strategies
      {
      public class SAMPLEOFERROR : Strategy
      {
      private bool wasLoaded;
      
      protected override void OnStateChange()
      {
      if (State == State.SetDefaults)
      {
      Description = @"";
      Name = "SAMPLEOFERROR";
      Calculate = Calculate.OnEachTick;////////
      EntriesPerDirection = 1;
      EntryHandling = EntryHandling.AllEntries;
      IsExitOnSessionCloseStrategy = true;
      ExitOnSessionCloseSeconds = 30;
      //IsFillLimitOnTouch = false;
      MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
      //OrderFillResolution = OrderFillResolution.Standard;
      Slippage = 0;
      StartBehavior = StartBehavior.WaitUntilFlat;
      TimeInForce = TimeInForce.Day;
      //TraceOrders = false;
      RealtimeErrorHandling = RealtimeErrorHandling.IgnoreAllErrors;
      //StopTargetHandling = StopTargetHandling.PerEntryExecution;
      BarsRequiredToTrade = 20;
      //Disable this property if your indicator requires custom values that cumulate with each new market data event.
      // See the Help Guide for additional information
      IsInstantiatedOnEachOptimizationIteration = true;
      
      // Keeps the strategy running as if no disconnect occurred
      ConnectionLossHandling = ConnectionLossHandling.KeepRunning;
      
      wasLoaded = false;
      
      
      
      }
      else if (State == State.Configure)
      {
      
      /*{//RealtimeErrorHandling - IgnoreAllErrors
      RealtimeErrorHandling = RealtimeErrorHandling.IgnoreAllErrors;
      //RealtimeErrorHandling.StopCancelCloseIgnoreRejects ;
      }*/
      
      
      
      
      // Trailing / Take profit
      {
      
      
      SetTrailStop(CalculationMode.Ticks, 100);
      
      // Sets a parabolic stop of with a ticks floor of StopLoss (LargeTrades signal)
      
      
      SetParabolicStop("LongB", CalculationMode.Ticks, 100, false, 0.03, 0.3, 0.01);
      
      
      
      SetParabolicStop("ShortB", CalculationMode.Ticks, 100, false, 0.03, 0.3, 0.01);
      
      
      
      SetProfitTarget(@"ShortA", CalculationMode.Ticks, 150);
      }
      }
      else if (State == State.DataLoaded)
      {
      
      
      wasLoaded = true;
      }
      else if (State == State.Terminated) // Managed orders
      {
      if(wasLoaded){
      // Cancel Orders
      if (Account != null)
      foreach (Order actOrdr in Account.Orders)
      {
      Account.Cancel(new[] { actOrdr });
      }
      // Cancel Positions
      //if (Position.MarketPosition == MarketPosition.Short)
      {
      ExitShort(Convert.ToInt32(1),"","");
      }
      //if (Position.MarketPosition == MarketPosition.Long)
      {
      ExitLong(Convert.ToInt32(1),"","");
      }
      
      }
      }
      }
      
      
      protected override void OnBarUpdate()
      {
      
      
      
      if (BarsInProgress != 0)
      return;
      
      if (CurrentBars[0] < 1)
      return;
      
      if (CurrentBar < BarsRequiredToTrade)
      return;
      
      
      ///////////////////////////////////////////////////////// SIGNALS
      
      
      
      // SELL
      if (Close[0]<Open[0])
      
      {
      EnterShortLimit(Convert.ToInt32(1), Close[0], @"ShortA");
      
      
      
      
      
      BackBrush = Brushes.Maroon;
      }
      
      // BUY
      if (Close[0]>Open[0])
      
      {
      
      
      EnterLong(Convert.ToInt32(1),@"LongB");
      
      
      
      BackBrush = Brushes.Lime;
      
      
      }
      
      // SELL
      if (Close[0]<Open[0])
      
      {
      
      
      EnterShort(Convert.ToInt32(1),@"ShortB");
      
      
      
      BackBrush = Brushes.Red;
      
      
      }
      
      // Exit if reverse the trend
      ///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> exit BUY
      // SELL
      /*if (Close[0]<Open[0])
      if (Account.Get(AccountItem.UnrealizedProfitLoss, Currency.UsDollar)>=20)
      
      if (Position.MarketPosition == MarketPosition.Long)
      {
      ExitLong(Convert.ToInt32(1),"",@"LongA");
      
      
      BackBrush = Brushes.Gray;
      }*/
      
      ///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> exit SELL
      // BUY
      if (Close[0]>Open[0])
      if (Account.Get(AccountItem.UnrealizedProfitLoss, Currency.UsDollar)>=20)
      
      if (Position.MarketPosition == MarketPosition.Short)
      {
      ExitShort(Convert.ToInt32(1),"",@"ShortA");
      
      
      BackBrush = Brushes.Gray;
      }
      
      }
      
      
      
      #region Properties
      
      
      
      #endregion
      
      }
      }

      Comment


        #18
        Hello bcomas,

        Thank you for your note.

        If your strategy is calculating OnEachTick, it's possible that your logic is firing multiple times. If the order is updated to the same price as it was initially submitted to, you'd get that message.

        We have a feature request tracking interest to have NinjaTrader silently ignore these specific errors since the error itself may not be consequential. The ticket ID is SFT-3667 and I have added a vote on your behalf. This is an internal number, but for anyone else wishing to have their interest tracked, please let our support staff know that you would like a vote added for this request.

        Feature Request Disclaimer.

        We receive many requests and cannot reasonably implement all requested features or changes. Interest is tracked internally and if enough interest is tracked, it would be weighed against how feasible it would be to make those changes to consider implementing.

        When new features are implemented, they will be listed in the Release Notes page of the Help Guide. The ID number will be different than the internal feature request tracking ID, but the description of the feature will let you know if that feature has been implemented.

        Release Notes - https://ninjatrader.com/support/help...ease_notes.htm


        Please let us know if we may assist further.
        Brandon H.NinjaTrader Customer Service

        Comment


          #19
          Hello Brandon,

          Thanks for your explanation. So , How can I replicate the NT SetTrailingStop() using the StopLoss() easily.
          Its advancing the Stop 1 tick if 1 tick of profit. This simple tailing suits for my needs. Using the StopLoss() for trailing the issue disappear.
          In the mean time when its fixed the feature request. May be exist some sample.

          Thanks!

          Bernard

          Comment


            #20
            Hello bcomas,

            Thank you for your note.

            See the SamplePriceModification example script in the help guide documentation below. This example demonstrates how to modify the price of stop loss and profit target orders by modifying the stop loss order to a break even price once a desired level of profit has been reached.

            SamplePriceModification - https://ninjatrader.com/support/help...of_stop_lo.htm

            Let us know if we may assist further.
            Brandon H.NinjaTrader Customer Service

            Comment


              #21
              .....If your strategy is calculating OnEachTick, it's possible that your logic is firing multiple times. If the order is updated to the same price as it was initially submitted to, you'd get that message..........

              Thanks for your response.

              May be adding IsFirstTickOfBar it will solve the issue. Only calling the SetTrailingStop(); on OnBarUpdate.
              Then the SetTrailingStop(); is calling once per bar when the strategy works OnEachTick.

              For small timeframes can suit the speed expectations.

              protected override void OnBarUpdate()

              Code:
               /// Trailing LONGB and SHORTB
              {
              if( UseTrailing )
              [B]if ( IsFirstTickOfBar )[/B]
              SetTrailStop("ShortA",CalculationMode.Ticks, StopLoss,false);
              
              // Sets a parabolic stop of with a ticks floor of StopLoss 
              if( UseTrailing )
              [B]if ( IsFirstTickOfBar )[/B]
              SetParabolicStop("LongB", CalculationMode.Ticks, StopLoss, false, 0.03, 0.3, 0.01);
              
              if( UseTrailing )
              [B]if ( IsFirstTickOfBar )[/B]
              SetParabolicStop("ShortB", CalculationMode.Ticks, StopLoss, false, 0.03, 0.3, 0.01);
              }
              Or trap the error and exit

              Code:
               protected override void OnOrderUpdate(Cbi.Order order, double limitPrice, double stopPrice,
              int quantity, int filled, double averageFillPrice,
              Cbi.OrderState orderState, DateTime time, Cbi.ErrorCode error, string comment)
              {
              if (order.Name == "Stop loss")
              {
              if (error == ErrorCode.UnableToChangeOrder)
              {
              Print("Order change failed, submitting hard exit.");
              ExitLong();
              ExitShort();
              }
              }
              }
              Last edited by bcomas; 02-09-2021, 06:06 AM.

              Comment


                #22
                Hello bcomas,

                Thank you for your note.

                Something you could do is use Exit methods instead of Set methods to create your own targets and stops. For trailing and parabolic stops, you would need to make your own targets with Exit methods instead of using the Set methods. If you know what price is being calculated beforehand, you could set up conditions that check if the order object is being changed to the same values. You could also collect the targets and stops by their name from OnOrderUpdate() after the order is submitted and assign the orders to variables.

                Please see the SampleOnOrderUpdate example script linked below that demonstrates how this could be accomplished. The breakeven logic in the script would essentially be what you would need for any trailing logic.

                SampleOnOrderUpdate - https://ninjatrader.com/support/help...and_onexec.htm

                Let us know if we may assist further.
                Brandon H.NinjaTrader Customer Service

                Comment


                  #23
                  Hello,
                  Thanks for your suggestion.
                  I have a simple question:
                  Why this issue happen in Live trading but works good in Sim?

                  Comment


                    #24
                    Hello bcomas,

                    Thank you for your note.

                    The error you are seeing is coming from your broker. The Sim101 account does not have this error since it simulates a standard broker. Not all brokers have the same errors or stipulations surround the rejection errors or account requirements.

                    Let us know if you have further questions.
                    Brandon H.NinjaTrader Customer Service

                    Comment


                      #25
                      Hello bcomas,

                      This is a follow up to my previous reply.

                      Please send your Log and Trace files to scriptingsupport[AT]ninjatrader.com so we may investigate this further. In the title of your email, please include ATTN: Brandon H, and in the body of the email provide a link to this forum thread.

                      Along with your Log and Trace files, please answer the following.
                      • Who are you connected to? This is displayed in green on the lower-left corner of the Control Center window.
                      • Who is your broker?
                      • What version of NinjaTrader are you using? Please provide the entire version number. This can be found under Help -> About (Example: 8.0.?.?)
                      Follow the steps below to manually attach your log and trace files to your response so I may investigate this matter further.
                      • Open your NinjaTrader folder under, "Documents" (sometimes called, "My Documents")
                      • Right-click on the 'log' and 'trace' folders and select Send To> Compressed (zipped) Folder.
                      • Send the 2 compressed folders as attachments to this email.
                      • Once complete, you can delete these compressed folders.
                      I look forward to assisting further.
                      Brandon H.NinjaTrader Customer Service

                      Comment


                        #26
                        Hello,

                        Thanks for your help

                        I found the solution to avoid the annoying messages every time the standard NT SetTraiStop() trails only in live trading.
                        The mesages are : LiveAccount××××, Cannot change order '439192773' because current order values already match. affected Order: BuyToCover 1 StopMarket @ 13546
                        I added some filters changing the SetTrailStop from ticks to percent and using Simulated Stops. Its suits my needs and the strategy results are the same that before the change.

                        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.Indicators;
                        using NinjaTrader.NinjaScript.DrawingTools;
                        #endregion
                        
                        
                        ///
                        //This namespace holds Strategies in this folder and is required. Do not change it.
                        namespace NinjaTrader.NinjaScript.Strategies
                        {
                        public class StrategyTEST : Strategy
                        {
                        
                        
                        protected override void OnStateChange()
                        {
                        if (State == State.SetDefaults)
                        {
                        [B]Description = @"Fix trailing stop , annoying messages only in live trading";
                        //LiveAccount××××, Cannot change order '439192773' because current order values already match. affected Order: BuyToCover 1 StopMarket @ 13546[/B]
                        Name = "StrategyTEST";
                        Calculate = Calculate.[B]OnEachTick[/B];////////
                        EntriesPerDirection = 1;
                        EntryHandling = EntryHandling.AllEntries;
                        IsExitOnSessionCloseStrategy = true;
                        ExitOnSessionCloseSeconds = 30;
                        IsFillLimitOnTouch = false;
                        MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
                        OrderFillResolution = OrderFillResolution.Standard;
                        Slippage = 0;
                        StartBehavior = StartBehavior.WaitUntilFlat;
                        TimeInForce = TimeInForce.Day;
                        TraceOrders = false;
                        RealtimeErrorHandling = RealtimeErrorHandling.[B]IgnoreAllErrors;/// Trailing[/B]
                        StopTargetHandling = StopTargetHandling.ByStrategyPosition;
                        BarsRequiredToTrade = 20;
                        //Disable this property if your indicator requires custom values that cumulate with each new market data event.
                        // See the Help Guide for additional information
                        IsInstantiatedOnEachOptimizationIteration = true;
                        
                        // StopLoss & ProfitTarget
                        UseProtectiveStops = true;//Long
                        UseTrailing = true;//Short
                        StopLoss = 100;//Long/Short
                        ProfitTarget = 150;//Long
                        ProfitTarget2 = 100;//Short
                        BreakEvenLong = 100;
                        
                        [B]SS1 /*(SS) Simulated Stops*/ = true;[/B]
                        
                        
                        }
                        else if (State == State.Configure)
                        {
                        // Stop Loss / Take profit LONGA
                        {
                        if( UseProtectiveStops )
                        
                        SetProfitTarget(@"LongA", CalculationMode.Ticks, ProfitTarget);
                        
                        if( UseProtectiveStops )
                        
                        SetStopLoss(@"LongA", CalculationMode.Ticks, StopLoss, SS1);
                        }
                        
                        // Take profit SHORTA
                        {
                        if( UseProtectiveStops )
                        
                        SetProfitTarget(@"ShortA", CalculationMode.Ticks, ProfitTarget2);
                        }
                        }
                        else if (State == State.DataLoaded)
                        {
                        
                        }
                        
                        
                        }
                        
                        [B]/// Trailing
                        protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int quantity, int filled, double averageFillPrice,
                        OrderState orderState, DateTime time, ErrorCode error, string nativeError)
                        {
                        if (Position.MarketPosition == MarketPosition.Short)
                        if (Close[0] == order.StopPrice)
                        
                        return;
                        if (Position.MarketPosition == MarketPosition.Long)
                        if (Close[0] == order.StopPrice)
                        
                        return;
                        }[/B]
                        
                        protected override void [B]OnBarUpdate()[/B]
                        {
                        
                        
                        if (BarsInProgress != 0)
                        return;
                        
                        if (CurrentBars[0] < 1)
                        return;
                        
                        if (CurrentBar < BarsRequiredToTrade)
                        return;
                        
                        
                        /// BreakEven LONGS
                        {
                        if( UseProtectiveStops )
                        // Resets the stop loss to the original value when all positions are closed
                        if (Position.MarketPosition == MarketPosition.Flat)
                        {
                        SetStopLoss(@"LongA", CalculationMode.Ticks, StopLoss, SS1);
                        }
                        
                        // If a long position is open, allow for stop loss modification to breakeven
                        else if (Position.MarketPosition == MarketPosition.Long)
                        {
                        // Once the price is greater than entry price+BreakEvenLong ticks, set stop loss to breakeven
                        if (Close[0] > Position.AveragePrice + BreakEvenLong * TickSize)
                        {
                        //Print("Move LongA to BE");
                        SetStopLoss(@"LongA",CalculationMode.Price, Position.AveragePrice, SS1);
                        }
                        }
                        
                        
                        }
                        
                        /// Trailing / SHORTA / SHORTB & LONGB
                        {
                        if( UseTrailing )
                        // Resets the stop loss to the original value when all positions are closed
                        if (Position.MarketPosition == MarketPosition.Flat)
                        {
                        SetTrailStop(@"LongB", CalculationMode.Ticks, StopLoss, SS1);
                        SetTrailStop(@"ShortA", CalculationMode.Ticks, StopLoss, SS1);
                        SetTrailStop(@"ShortB", CalculationMode.Ticks, StopLoss, SS1);
                        }
                        else if (Position.MarketPosition == MarketPosition.Short)
                        if( UseTrailing )
                        {
                        SetTrailStop(@"ShortA",CalculationMode.[B]Percent, 00.1,SS1[/B]);
                        }
                        else if (Position.MarketPosition == MarketPosition.Long)
                        if( UseTrailing )
                        {
                        SetTrailStop(@"LongB",CalculationMode.[B]Percent, 00.1,SS1[/B]);
                        }
                        else if (Position.MarketPosition == MarketPosition.Short)
                        if( UseTrailing )
                        {
                        SetTrailStop(@"ShortB",CalculationMode.[B]Percent, 00.1,SS1[/B]);
                        }
                        }
                        
                        // Check for buy condition
                        if (RVI(14)[0] > 50 && CrossAbove(SMA(9), SMA(14), 1))
                        
                        {
                        EnterLongLimit(Convert.ToInt32(1), Close[0], @"LongA");/////////////BUY
                        
                        //PlaySound(@"C:\Program Files (x86)\NinjaTrader 8\sounds\Alert4.wav");
                        BackBrush = Brushes.Green;
                        
                        }
                        
                        
                        // Check for sell condition
                        if (RVI(14)[0] > 50 && CrossBelow(SMA(9), SMA(14), 1))
                        
                        {
                        EnterShortLimit(Convert.ToInt32(1), Close[0], @"ShortA");/////////////SELL
                        
                        
                        //PlaySound(@"C:\Program Files (x86)\NinjaTrader 8\sounds\Alert3.wav");
                        BackBrush = Brushes.Maroon;
                        
                        }
                        // Check for buy condition
                        if (RVI(14)[0] > 50 && CrossAbove(SMA(9), SMA(14), 1))
                        
                        {
                        EnterLong(Convert.ToInt32(1),@"LongB");/////////////BUY
                        
                        
                        //PlaySound(@"C:\Program Files (x86)\NinjaTrader 8\sounds\Alert4.wav");
                        BackBrush = Brushes.Lime;
                        
                        }
                        
                        // Check for sell condition
                        if (RVI(14)[0] > 50 && CrossBelow(SMA(9), SMA(14), 1))
                        
                        {
                        EnterShort(Convert.ToInt32(1),@"ShortB");/////////////SELL
                        
                        
                        //PlaySound(@"C:\Program Files (x86)\NinjaTrader 8\sounds\Alert3.wav");
                        BackBrush = Brushes.Red;
                        
                        }
                        
                        }
                        
                        
                        
                        #region Properties
                        
                        [Display(ResourceType = typeof(Custom.Resource), Name = "Use protective stops?", Order = 0, GroupName = "Stops & Targets")]
                        public bool UseProtectiveStops
                        { get; set; }
                        
                        [Display(ResourceType = typeof(Custom.Resource), Name = "Use Trailing for shorts?", Order = 1, GroupName = "Stops & Targets")]
                        public bool UseTrailing
                        { get; set; }
                        
                        [NinjaScriptProperty]
                        [Range(1, int.MaxValue)]
                        [Display(ResourceType = typeof(Custom.Resource), Name="Stop loss", Description="Stop loss (ticks)", Order=2, GroupName="Stops & Targets")]
                        public int StopLoss
                        { get; set; }
                        
                        [NinjaScriptProperty]
                        [Range(1, int.MaxValue)]
                        [Display(ResourceType = typeof(Custom.Resource), Name="Profit target for Longs", Description="Profit target (in ticks)", Order=3, GroupName="Stops & Targets")]
                        public int ProfitTarget
                        { get; set; }
                        
                        [NinjaScriptProperty]
                        [Range(1, int.MaxValue)]
                        [Display(ResourceType = typeof(Custom.Resource), Name="Profit target for Shorts", Description="Profit target (in ticks)", Order=4, GroupName="Stops & Targets")]
                        public int ProfitTarget2
                        { get; set; }
                        
                        [NinjaScriptProperty]
                        [Range(1, int.MaxValue)]
                        [Display(ResourceType = typeof(Custom.Resource), Name="BreakEven Long", Description="BreakEven Long", Order=5, GroupName="Stops & Targets")]
                        public int BreakEvenLong
                        { get; set; }
                        
                        
                        [B][Display(ResourceType = typeof(Custom.Resource), Name = "Use Hidden stops?", Order = 7, GroupName = "Stops & Targets")]
                        public bool SS1
                        { get; set; }[/B]
                        
                        #endregion
                        
                        
                        }
                        }

                        Comment

                        Latest Posts

                        Collapse

                        Topics Statistics Last Post
                        Started by andrewtrades, Today, 04:57 PM
                        1 response
                        10 views
                        0 likes
                        Last Post NinjaTrader_Manfred  
                        Started by chbruno, Today, 04:10 PM
                        0 responses
                        6 views
                        0 likes
                        Last Post chbruno
                        by chbruno
                         
                        Started by josh18955, 03-25-2023, 11:16 AM
                        6 responses
                        436 views
                        0 likes
                        Last Post Delerium  
                        Started by FAQtrader, Today, 03:35 PM
                        0 responses
                        9 views
                        0 likes
                        Last Post FAQtrader  
                        Started by rocketman7, Today, 09:41 AM
                        5 responses
                        20 views
                        0 likes
                        Last Post NinjaTrader_Jesse  
                        Working...
                        X