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

Adjusting stop once in a trade

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

    Adjusting stop once in a trade

    Hello,

    I have been working on some code that was initially generated by the strategy builder. I'm currently working on building it out to a basic boilerplate template for future use.

    Currently the entry is filtered by user input (entering LONG or SHORT), and when a bar closes up or down (based on the user's input for LONG/SHORT) it enters a trade as expected, and places the initial stop loss as expected.

    For the couple of hours I've been trying to get the stop loss to trail behind bars that close in favor of the position. For example if long then wait for an up bar. Once an up bar closes, update the price of the stop loss to a new price below the recently close up bar. There is a user input called stopBufferTicks that controls how far below the recently closed up bar the new stop is to be placed.

    I've done this in a couple of other platforms with very similar logic, but I am definitely missing something. Please help, I'm spinning my wheels on this.

    I'm going to paste the code for the strategy in this post. I did so recently and was asked to re-paste a portion of the code (on another question) so if you would like me to do that feel free to let me know which parts you want me to cut out. I am including more code than the logic in question in the event that my error is not where I expect it to be.

    Edit: Including screenshot of testing showing that the code is getting to the print statement, along with a ten tick ruler showing an unmoved initial stop

    Code:

    public class GRAYBOXv3 : Strategy
    {

    protected override void OnStateChange()
    {
    if (State == State.SetDefaults)
    {
    Description = @"dont know yet";
    Name = "GRAYBOXv3";
    Calculate = Calculate.OnBarClose;
    EntriesPerDirection = 1;
    EntryHandling = EntryHandling.AllEntries;
    IsExitOnSessionCloseStrategy = true;
    ExitOnSessionCloseSeconds = 30;
    IsFillLimitOnTouch = false;
    MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
    OrderFillResolution = OrderFillResolution.Standard;
    Slippage = 0;
    StartBehavior = StartBehavior.WaitUntilFlat;
    TimeInForce = TimeInForce.Gtc;
    TraceOrders = false;
    RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
    StopTargetHandling = StopTargetHandling.PerEntryExecution;
    BarsRequiredToTrade = 20;
    // Disable this property for performance gains in Strategy Analyzer optimizations
    // See the Help Guide for additional informationasdf
    IsInstantiatedOnEachOptimizationIteration = true;
    LongShort = @"Neither";
    StopSize =10;
    //stopBufferTicks =10;
    }
    else if (State == State.Configure)
    {
    //int sl = StopSize;
    SetStopLoss(@"short entry", CalculationMode.Ticks, StopSize, false);
    SetStopLoss(@"long entry", CalculationMode.Ticks, StopSize, false);
    }
    }
    double origStopPrice;
    protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error, string nativeError)
    {
    origStopPrice = stopPrice;
    }

    protected override void OnBarUpdate()
    {

    bool _oktolong = LongShort == "LONG";
    bool _oktoshort = LongShort == "SHORT";
    if (BarsInProgress != 0)
    return;

    if (CurrentBars[0] < 1)
    return;
    if(State==State.Historical) return;

    // Long
    if (Close[0] > Open[0] && _oktolong)
    {
    EnterLong(Convert.ToInt32(DefaultQuantity), @"long entry");
    }
    // Short
    if (Close[0] < Open[0] && _oktoshort)
    {
    EnterShort(Convert.ToInt32(DefaultQuantity), @"short entry");
    }

    //If current position is long and the previous bar was an up bar
    if(Position.MarketPosition == MarketPosition.Long && Close[1] > Open[1])
    {
    if((Low[1]-stopBufferTicks) > origStopPrice) //check that new stop location is greater than original stop (to avoid widening stop)
    {
    SetStopLoss(CalculationMode.Price,(Low[1]-stopBufferTicks));//update stop price to below prior bar's low by "stopBufferTicks"
    Print("it's at least getting here");
    }
    //once the logic to trail long stops works, copy/paste/modify it for shorts below:
    }else if (Position.MarketPosition == MarketPosition.Short && Close[0] < Open[0])
    {
    if((High[1]+stopBufferTicks) < origStopPrice)
    {
    SetStopLoss(CalculationMode.Price, High[1]+stopBufferTicks);
    }
    }
    }



    #region Properties
    [NinjaScriptProperty]
    [Display(Name="LongShort", Order=1, GroupName="Parameters")]
    public string LongShort
    { get; set; }

    [NinjaScriptProperty]
    [Display(Name="Enter Stop in Ticks", Order=1, GroupName="Parameters")]
    public int StopSize
    { get; set; }

    [NinjaScriptProperty]
    [Display(Name="Enter Stop Buffer in Ticks", Order=1, GroupName="Parameters")]
    public int stopBufferTicks
    { get; set; }
    #endregion

    }
    Attached Files
    Last edited by butt_toast; 07-20-2021, 01:51 PM.

    #2
    Hello butt_toast,

    Thanks for your post.

    Please see the attached example script which demonstrates setting a stop loss with SetStopLoss() and having it trail as the current bar moves in our favor.

    In the example script, we use a bool variable to control the logic of our stop loss. First, we check if we are in a flat position, then we set our bool to false and call our SetStopLoss() method so that the stop loss resets to the original value when all positions are closed. After that, we create our entry order condition, call EnterLong(), and flip the bool to true. Next, we check if our bool is true and if the current Close[0] price is greater than the previous Close[1] price and call our SetStopLoss() method with a value of Close[1]. This means that the stop loss will move to the previous close price if the current close price is greater than the previous close. In other words, if we are in a long position and the current bar is moving in our favor, the stop loss will move to the previous close so that it trails in our favor.

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

    Comment


      #3
      Originally posted by NinjaTrader_BrandonH View Post
      Hello butt_toast,

      Thanks for your post.

      Please see the attached example script which demonstrates setting a stop loss with SetStopLoss() and having it trail as the current bar moves in our favor.

      In the example script, we use a bool variable to control the logic of our stop loss. First, we check if we are in a flat position, then we set our bool to false and call our SetStopLoss() method so that the stop loss resets to the original value when all positions are closed. After that, we create our entry order condition, call EnterLong(), and flip the bool to true. Next, we check if our bool is true and if the current Close[0] price is greater than the previous Close[1] price and call our SetStopLoss() method with a value of Close[1]. This means that the stop loss will move to the previous close price if the current close price is greater than the previous close. In other words, if we are in a long position and the current bar is moving in our favor, the stop loss will move to the previous close so that it trails in our favor.

      Let us know if we may assist further.
      Thank you so much for this. I updated my logic to include the logic you shared.

      I did have another bug in there in case anyone comes across this thread in the future: also had to change the way I was calculating the new stop price - had to multiply stopBufferTicks by TickValue. Not only this but I also had to use the longer version of SetStopLoss() to include the tag for the entry and also false at the end. This is what I mean:

      Change this:
      SetStopLoss(CalculationMode.Price,(Low[1]-stopBufferTicks*TickSize));

      To this:
      SetStopLoss("long entry", CalculationMode.Price,(Low[0]-stopBufferTicks*TickSize),false);

      Not sure why, but I am happy that it's working now.

      I have been absolutely blown away by how helpful you guys are. I have been telling all of my colleagues (all of them 100% of them use Sierra) about the support you guys provide. It's unreal how good it is. Thank you so much.

      Edit:
      Also need to make sure that the section of code that resets the stop values (as shown in the example shared by Brandon) uses this longer way of adjusting the stop.
      Last edited by butt_toast; 07-20-2021, 04:03 PM.

      Comment


        #4
        Originally posted by NinjaTrader_BrandonH View Post
        Hello butt_toast,

        Thanks for your post.

        Please see the attached example script which demonstrates setting a stop loss with SetStopLoss() and having it trail as the current bar moves in our favor.

        In the example script, we use a bool variable to control the logic of our stop loss. First, we check if we are in a flat position, then we set our bool to false and call our SetStopLoss() method so that the stop loss resets to the original value when all positions are closed. After that, we create our entry order condition, call EnterLong(), and flip the bool to true. Next, we check if our bool is true and if the current Close[0] price is greater than the previous Close[1] price and call our SetStopLoss() method with a value of Close[1]. This means that the stop loss will move to the previous close price if the current close price is greater than the previous close. In other words, if we are in a long position and the current bar is moving in our favor, the stop loss will move to the previous close so that it trails in our favor.

        Let us know if we may assist further.
        Sorry to quote you again but I have another question.

        Do you have any examples showing how I would enter on one data series (for example a candlestick chart) and trail on another data series (for example a range chart)?

        Comment


          #5
          Hello butt_toast,

          Thanks for your note.

          This would not be possible to accomplish using Set methods. Instead, you would need to use Exit methods. This is because Set methods are tied to the primary series that the strategy is running on.

          An additional data series could be added to the script using AddDataSeries(). Then, you could do a BarsInProgress == 1 check if the added series is the bars object processing and reference the BarsInProgress value of the added series (BarsInProgress 1) for the barsInProgressIndex property when you call your Exit method logic.

          See the attached example script demonstrating this.

          See the help guide documentation below for more information.
          AddDataSeries(): https://ninjatrader.com/support/help...dataseries.htm
          BarsInProgress: https://ninjatrader.com/support/help...inprogress.htm
          Managed Approach Order Methods: https://ninjatrader.com/support/help...d_approach.htm

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

          Comment


            #6
            Originally posted by NinjaTrader_BrandonH View Post
            Hello butt_toast,

            Thanks for your note.

            This would not be possible to accomplish using Set methods. Instead, you would need to use Exit methods. This is because Set methods are tied to the primary series that the strategy is running on.

            An additional data series could be added to the script using AddDataSeries(). Then, you could do a BarsInProgress == 1 check if the added series is the bars object processing and reference the BarsInProgress value of the added series (BarsInProgress 1) for the barsInProgressIndex property when you call your Exit method logic.

            See the attached example script demonstrating this.

            See the help guide documentation below for more information.
            AddDataSeries(): https://ninjatrader.com/support/help...dataseries.htm
            BarsInProgress: https://ninjatrader.com/support/help...inprogress.htm
            Managed Approach Order Methods: https://ninjatrader.com/support/help...d_approach.htm

            Please let us know if we may assist further.
            I cannot thank you enough for all of this you have been saving me hours and hours of headaches.

            Quick question about the Set methods vs Exit methods:
            Because the Set methods are tied to the primary series, can I still keep using the Set methods for placing the initial stop and for resetting the stop once flat - and then use Exit methods for the trail using the added series?

            Comment


              #7
              Hello butt_toast,

              Thanks for your note.

              It is not suggested to use the Exit methods and the Set methods together as it may create a violation of the Managed Approach Internal Order Handling Rules, linked here: https://ninjatrader.com/support/help...d_approach.htm

              Instead, you should use either Exit methods or Set methods but not both in the same script.

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

              Comment


                #8
                Originally posted by NinjaTrader_BrandonH View Post
                Hello butt_toast,

                Thanks for your note.

                It is not suggested to use the Exit methods and the Set methods together as it may create a violation of the Managed Approach Internal Order Handling Rules, linked here: https://ninjatrader.com/support/help...d_approach.htm

                Instead, you should use either Exit methods or Set methods but not both in the same script.

                Let us know if we may further assist.
                With your help I am really really close to getting it to work.

                I finally got Exit methods to replace all the Set methods. I have the range bar data series added.

                I noticed that my stop was trailing with the new Exit methods - however it was doing so on the primary data series.

                So I went back to the code and changed the logic to include, for example: Low[1][0] (to reference the low of the range bar series). The error I get from doing this is: "Cannot apply indexing with [] to an expression of type 'double'".

                Any idea what's going on with that?? (EDIT: solution at bottom of this post, I left the question in in case someone else has this problem and comes across this thread)


                The code that's producing this error:

                //FIND NEW STOP PRICE FOR LONGS
                if(Position.MarketPosition == MarketPosition.Long && Close[1][0] > Open[1][0] && moveStopBool)
                {
                if((Low[1][0]-stopBufferTicks*TickSize) > origStopPrice)
                {
                newStopPrice = Low[1][0] - stopBufferTicks * TickSize;
                Print("Time: " + Time[0] + " newStopPrice: " + (Low[1][0] - stopBufferTicks * TickSize));
                }
                //FIND NEW STOP PRICE FOR SHORTS
                }else if (Position.MarketPosition == MarketPosition.Short && Close[1][0] < Open[1][0] && moveStopBool)
                {
                if((High[1][0]+stopBufferTicks*TickSize) < origStopPrice)
                {
                newStopPrice = High[1][0] + stopBufferTicks * TickSize;
                }
                }



                EDIT:
                Needed to add "s" to the end of words like Low[][] referring to the addttl data series. In case anyone comes across this.
                Last edited by butt_toast; 07-21-2021, 01:50 PM.

                Comment


                  #9
                  Hello butt_toast,

                  Thanks for your inquiry.

                  To reference the Low price of the added series in a multi-instrument script, you could use Lows[1][0].

                  See this help guide page for more information about using Lows[1][0]: https://ninjatrader.com/support/helpGuides/nt8/lows.htm

                  In regard to your exit method trailing on the primary series, you would need to ensure that you are checking if BarsInProgress == 1 and also use the correct BarsInProgress value for the barsInProgressIndex property in your exit method. For example, the ExitLongStopLimit() syntax would be as follows. This is also seen in the script example attached in post #5.

                  ExitLongStopLimit(int barsInProgressIndex, bool isLiveUntilCancelled, int quantity, double limitPrice, double stopPrice, string signalName, string fromEntrySignal)

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

                  Comment


                    #10
                    Originally posted by NinjaTrader_BrandonH View Post

                    Let us know if we may assist further.
                    Got it working but there are two new issues.

                    1. The trail stop will adjust the stop backwards depending on the circumstances. I thought I'd addressed this logic in the code but since I'm a beginner coder I'm not able to see what I've done. Could also be the many hours I've been trying to get this to work and need a break.
                    2. On shorts sometimes it gives the error "submitted an order that generated the following error 'Unable to change order'. Strategy has sent cancel requests, attempted to close the position and terminated itself." Seems most likely that the strategy is trying to submit a buy-to-close stop market order below market price maybe?

                    Is there anything obvious that people normally do to prevent these two errors? Just some generic practice I can adopt, in order to avoid re-inventing the wheel?

                    Code:

                    public class TEMPLATEv6: Strategy
                    {
                    private bool weFlat;
                    private bool moveStopBool = false;
                    private Order entryOrderLong = null;
                    private Order entryOrderShort = null;
                    private double newStopPrice;
                    private double recentTradeEntryPrice ;
                    private double origStopPriceShorts;
                    private double origStopPriceLongs;
                    private double recentStopPriceShorts;
                    private double recentStopPriceLongs;

                    protected override void OnStateChange()
                    {
                    if (State == State.SetDefaults)
                    {
                    Description = @"dont know yet";
                    Name = "TEMPLATEv6";
                    Calculate = Calculate.OnBarClose;
                    EntriesPerDirection = 1;
                    EntryHandling = EntryHandling.AllEntries;
                    IsExitOnSessionCloseStrategy = true;
                    ExitOnSessionCloseSeconds = 30;
                    IsFillLimitOnTouch = false;
                    MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
                    OrderFillResolution = OrderFillResolution.Standard;
                    Slippage = 0;
                    StartBehavior = StartBehavior.WaitUntilFlat;
                    TimeInForce = TimeInForce.Gtc;
                    TraceOrders = false;
                    RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
                    StopTargetHandling = StopTargetHandling.PerEntryExecution;
                    BarsRequiredToTrade = 2;
                    // Disable this property for performance gains in Strategy Analyzer optimizations
                    // See the Help Guide for additional informationasdf
                    IsInstantiatedOnEachOptimizationIteration = true;
                    LongShort = @"Neither";
                    StopSize =10;
                    rotationSize =10;
                    stopBufferTicks =10;
                    bool weFlat = false;
                    bool moveStopBool = false;
                    }
                    else if (State == State.Configure)
                    {
                    AddDataSeries(Data.BarsPeriodType.Range, rotationSize);
                    ClearOutputWindow();
                    }
                    }
                    /* COMMENTING THIS OUT FOR NOW BUT LEAVING IT IN IN CASE I NEED IT
                    double origStopPrice;
                    protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error, string nativeError)
                    {
                    recentTradeEntryPrice= stopPrice;
                    }
                    */

                    protected override void OnExecutionUpdate (Execution execution, string executionId, double price, int quantity, MarketPosition marketPosition, string orderId, DateTime time)
                    {
                    recentTradeEntryPrice = price;
                    ExitLongStopMarket(1, true, Position.Quantity, recentTradeEntryPrice - (stopBufferTicks * TickSize),"long exit","long entry");
                    ExitShortStopMarket(1, true, Position.Quantity,recentTradeEntryPrice + (stopBufferTicks * TickSize),"short exit","short entry");
                    origStopPriceLongs = recentTradeEntryPrice - (stopBufferTicks * TickSize);
                    origStopPriceShorts = recentTradeEntryPrice + (stopBufferTicks * TickSize);

                    }

                    protected override void OnBarUpdate()
                    {
                    bool _oktolong = LongShort == "LONG";
                    bool _oktoshort = LongShort == "SHORT";

                    if(State==State.Historical)
                    return;

                    if (CurrentBars[0] < 1 && CurrentBars[1] < 1)
                    return;

                    if (Position.MarketPosition == MarketPosition.Flat)
                    {
                    weFlat = true;
                    moveStopBool = false;
                    entryOrderShort = null;
                    entryOrderLong = null;
                    }


                    if (BarsInProgress == 0)
                    {
                    // Long
                    if (Close[0] > Open[0] && _oktolong && weFlat && (entryOrderLong == null))
                    {
                    entryOrderLong = EnterLong(Convert.ToInt32(DefaultQuantity), @"long entry");
                    weFlat = false;
                    moveStopBool = true;
                    }
                    // Short
                    if (Close[0] < Open[0] && _oktoshort && weFlat && (entryOrderShort == null))
                    {
                    entryOrderShort = EnterShort(Convert.ToInt32(DefaultQuantity), @"short entry");
                    weFlat = false;
                    moveStopBool = true;
                    }
                    }
                    if (BarsInProgress == 1)
                    {
                    //FIND NEW STOP PRICE FOR LONGS
                    if(Position.MarketPosition == MarketPosition.Long && Closes[1][0] > Opens[1][0] && moveStopBool)
                    {
                    if((Lows[1][0]-stopBufferTicks*TickSize) > origStopPriceLongs && (Lows[1][0]-stopBufferTicks*TickSize) > recentStopPriceLongs)
                    {
                    recentStopPriceLongs = newStopPrice;
                    newStopPrice = Lows[1][0] - stopBufferTicks * TickSize;
                    }
                    //FIND NEW STOP PRICE FOR SHORTS
                    }else if (Position.MarketPosition == MarketPosition.Short && Closes[1][0] < Opens[1][0] && moveStopBool)
                    {
                    if((Highs[1][0]+stopBufferTicks*TickSize) < origStopPriceShorts && (Highs[1][0]+stopBufferTicks*TickSize) < recentStopPriceShorts) //make a previous stop price and reset that with the bool
                    {
                    recentStopPriceShorts = newStopPrice;
                    newStopPrice = Highs[1][0] + stopBufferTicks * TickSize;
                    }
                    }
                    //TRAIL LONG
                    if ((Lows[1][0]-stopBufferTicks*TickSize) > origStopPriceLongs && moveStopBool)
                    {
                    Print("New stop location: " + (Lows[1][0]-stopBufferTicks*TickSize) + "Original stop location: " + origStopPriceLongs);
                    if (entryOrderLong != null)
                    {
                    ExitLongStopMarket(1, true, Position.Quantity, newStopPrice,"long exit","long entry");
                    }
                    }
                    //TRAIL SHORT
                    if((Highs[1][0]+stopBufferTicks*TickSize) < origStopPriceShorts && moveStopBool)
                    {
                    if (entryOrderShort != null)
                    {
                    ExitShortStopMarket(1, true, Position.Quantity, newStopPrice,"short exit","short entry");
                    }
                    }
                    }



                    }



                    #region Properties
                    [NinjaScriptProperty]
                    [Display(Name="LongShort", Order=0, GroupName="Parameters")]
                    public string LongShort
                    { get; set; }

                    [NinjaScriptProperty]
                    [Display(Name="Enter Stop in Ticks", Order=1, GroupName="Parameters")]
                    public int StopSize
                    { get; set; }

                    [NinjaScriptProperty]
                    [Display(Name="RotationSize", Order=2, GroupName="Parameters")]
                    public int rotationSize
                    { get; set; }


                    [NinjaScriptProperty]
                    [Display(Name="Enter TrailStop Buffer in Ticks", Order=3, GroupName="Parameters")]
                    public int stopBufferTicks
                    { get; set; }

                    #endregion
                    Last edited by butt_toast; 07-21-2021, 03:52 PM.

                    Comment


                      #11
                      && (currStopPrice < (Lows[1][0]-stopBufferTicks*TickSize)))

                      In the event of a long it looks like this logic addresses the issue of moving a stop backwards.

                      Comment


                        #12
                        Hello butt_toast,

                        Thanks for your note.

                        I'm happy to hear that you have figured out the logic addressing the issue of moving a stop backward.

                        In regard to your second inquiry, if the strategy is trying to submit a buy-to-close stop market order below market price and this is causing the error "'Stop price can't be changed below the market." "Unable to change order'. Strategy has sent cancel requests, attempted to close the position and terminated itself.", you would need to ensure that the stop order is being placed on the correct side of the market.

                        If this is due to market volatility then there isn't really a way to 100% avoid this occurring, as in volatile markets the market could move so far and fast that this would occur.

                        Something you could do is change the strategy to use StopCancelCloseIgnoreErrors for its error handling; you could then capture the rejection in OnOrderUpdate, and then either try to resubmit the stop at a different price or submit an exit order to close the position.

                        Or, you could place your stop loss further from the current price.

                        You can find more information about real-time error handling for strategies here, along with an example of capturing the rejection:
                        https://ninjatrader.com/support/help...orhandling.htm

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

                        Comment


                          #13
                          Originally posted by NinjaTrader_BrandonH View Post
                          Hello butt_toast,

                          Thanks for your note.

                          I'm happy to hear that you have figured out the logic addressing the issue of moving a stop backward.

                          In regard to your second inquiry, if the strategy is trying to submit a buy-to-close stop market order below market price and this is causing the error "'Stop price can't be changed below the market." "Unable to change order'. Strategy has sent cancel requests, attempted to close the position and terminated itself.", you would need to ensure that the stop order is being placed on the correct side of the market.

                          If this is due to market volatility then there isn't really a way to 100% avoid this occurring, as in volatile markets the market could move so far and fast that this would occur.

                          Something you could do is change the strategy to use StopCancelCloseIgnoreErrors for its error handling; you could then capture the rejection in OnOrderUpdate, and then either try to resubmit the stop at a different price or submit an exit order to close the position.

                          Or, you could place your stop loss further from the current price.

                          You can find more information about real-time error handling for strategies here, along with an example of capturing the rejection:
                          https://ninjatrader.com/support/help...orhandling.htm

                          Let us know if we may assist further.
                          It was pure user error causing the stop error.

                          I was printing out the prices of the stop before and after modification and everything looked fine, which is what was throwing me off.
                          Then I noticed that the code used to specify the location of the new stop was using a variable that was equal to zero. Fixed that and now we're all set.

                          Now I have boiler plate code that can use two data series. I'm sure there are redundant things in there but it does exactly what I want it to.

                          I cannot thank you and your team enough for your incredible combination of knowledge, expertise, and patience.

                          Comment

                          Latest Posts

                          Collapse

                          Topics Statistics Last Post
                          Started by yertle, Yesterday, 08:38 AM
                          7 responses
                          28 views
                          0 likes
                          Last Post yertle
                          by yertle
                           
                          Started by bmartz, 03-12-2024, 06:12 AM
                          2 responses
                          21 views
                          0 likes
                          Last Post bmartz
                          by bmartz
                           
                          Started by funk10101, Today, 12:02 AM
                          0 responses
                          5 views
                          0 likes
                          Last Post funk10101  
                          Started by gravdigaz6, Yesterday, 11:40 PM
                          1 response
                          9 views
                          0 likes
                          Last Post NinjaTrader_Manfred  
                          Started by MarianApalaghiei, Yesterday, 10:49 PM
                          3 responses
                          11 views
                          0 likes
                          Last Post NinjaTrader_Manfred  
                          Working...
                          X