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

How To Prevent a StopLoss from Adjusting On Every OnBarUpdate

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

  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    I did look at the code you suggested. The is psuedo code and there are a lot of unknowns. I do not know what is causing the issue, because I have no idea what the conditions are evaluating as, what orders may already be working that would violate the internal handling rules, what the entries per direction is. TraceOrders would tell us exactly what is wrong if the order method is being called.

    If you only want to know if the order methods calls are right, I can say yes, the method calls are correct. However, there can be many other reasons an order is not submitted or filled.

    The way to understand what is happening is with prints. If this was my script I would first be going to the TraceOrders and prints to understanding of what is going wrong.

    To move forward, we need the output from TraceOrders and prints. There are many many threads on this forum where I have assisted other community members on adding prints, getting output, analzying the output, understanding what is wrong, and advising how to correct the script for the behavior the coder is wanting. And I am very happy to help. But to do so, you would need to follow this direction to provide me the information to assist.

    I am not expecting you to understand how all of the methods work and I can answer any direct questions you have about method (instead of whats wrong with this code without doing any debugging yourself).

    I cannot advise what is wrong without seeing the output. The information is how we understand what is wrong.

    If you have been programming since 1980, you may find that enabling TraceOrders and adding prints will be very simple for you, and easy to save the output from the window to a text file, as these are not advanced. Like any programming in any language, debugging can sometimes be a majority of the development process.

    As per your example:
    EXAMPLE: SetStopLoss and SetProfitTarget has to be above EnterShort or they won't work. This critical fact is not in the docs. This is just one example of many where the docs fail to demonstrate real world usage.
    This actually depends on the direction of the entry and follows the rules the brokerage have set. A buy stop order must have the stop price above the current ask, and a sell stop below the current bid. If the entry is a market order, then this would be based off the current ask and current bid at the time of the fill.

    The rules are the same if you were to call you broker and ask to place a stop market order over the phone as these are brokerage trading rules.

    Below is a link to investopdia, an educational site, on how a stop market order works. (See under the heading 'Buy-Stop')
    https://www.investopedia.com/terms/s/stoporder.asp


    If the order is on the wrong side of the market, the output from TraceOrders and a print of the order object in OnOrderUpdate() would immediately identify this as the issue.


    Please let me know if you want to debug this and figure what is wrong and how to correct it. I am very happy to assist you through the process.
    Last edited by NinjaTrader_ChelseaB; 08-17-2021, 03:44 PM.

    Leave a comment:


  • coopgrafik
    replied
    Chelsea,

    Before you typed 3 paragraphs of how you can't help me did you look at the code? This is literally the same code you provided to me in your previous post. I have simply added additional calls to go short as well as long. I am not asking you to debug my code. As you can see this is not even a real algo as there are no conditions.I'm asking for help with the methods you recommended I use. I'm searching for an explanation on how all of these methods work together.

    I have looked the the docs and they are extremely bare.

    OnExecutionUpdate code example from the docs.

    Code:
    // Example
    protected override void OnExecutionUpdate(Executio n execution, string executionId, double price, int  quantity, MarketPosition marketPosition, string o rderId, DateTime time)
    {
      Print(execution.ToString());
    }

    ExitLongStopMarket code example from the docs.


    Code:
    // Exits position
    ExitLongStopMarket(stopPrice);

    This is it. This is what you give your customers yet you expect me to somehow understand how these methods work? Nothing talks about how an stoploss is bound to an order. There are no examples of anything. The docs list the arguments and then show only the most basic usage of that method without any context of how they are supposed to work together. EXAMPLE: SetStopLoss and SetProfitTarget has to be above EnterShort or they won't work. This critical fact is not in the docs. This is just one example of many where the docs fail to demonstrate real world usage.

    I first started coding in 1980: basic and assembler. Then HTML in the 90s. A full LAMP stack in the 2000s and finally into a MEAN stack. I have made my living as a developer. I own a creative agency that has won awards for the projects I have built. I'm also founder a ad tech company that servers banner ads for the movies and build that platform from the ground up. I know how to code.

    Please stop insisting that I need to take a class to learn C#. I'm confused and offended by that. I could do 200 hours on codecademy and learn every single aspect of C# but at the end I will still have no idea how NinjaTrader proprietary scripting language deal with advanced order handling BECAUSE THIS HAS NOTHING TO DO WITH C#. NinjaScript is a proprietary library of methods. NinjaTrader created it, not Microsoft so if I ask a question on how the methods work or why they are not working I feel like that it a completely fair question.


    Leave a comment:


  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    You will need to use prints and TraceOrders to understand the behavior.

    Below is a link to a forum post that demonstrates how to use prints to understand behavior.
    https://ninjatrader.com/support/foru...121#post791121

    Start by enabling TraceOrders. Then print the time of the bar outside and above the condition that is not evaluating as true when you expect. Next add all of the values in the condition to the print.

    The prints and TraceOrders will tell you why any condition or any order is or is not submitted.


    Unfortunately, in the support department at NinjaTrader it is against our policy to create, debug, or modify, code or logic for our clients. Further, we do not provide C# programming education services or one on one educational support over the phone in our NinjaScript Support department. This is so that we can maintain a high level of service for all of our clients as well as our associates.

    That said, through email we are happy to answer any questions you may have about NinjaScript if you decide to code this yourself. We are also happy to assist with finding resources in our help guide as well as simple examples, and we are happy to assist with guiding you through the debugging process to assist you with understanding unexpected behavior.

    You can also contact a professional NinjaScript Consultant who would be eager to create or modify this script at your request or assist you with your script. The NinjaTrader Ecosystem has affiliate contacts who provide educational as well as consulting services. Please let me know if you would like our NinjaTrader Ecosystem team follow up with you with a list of affiliate consultants who would be happy to create this script or any others at your request or provide one on one educational services.

    Leave a comment:


  • coopgrafik
    replied
    Chelsea,

    I'm been pecking away at this on and off for the last week and I'm just not able to get this working in tow directions. Can you look at the code below and let be know why the order is not firing off at all? I can get this to work long or short but when I try to build this in a way where the strategy will go long under the right conditions and the later (not at the same time) short under the correct conditions the thing just kind of does nothing. I have tried to put unique names for everything hoping that would help but no dice.

    Any ideas?


    Code:
    protected override void OnBarUpdate()
    {
    
    if (BarsInProgress != 0)
    return;
    
    if (CurrentBars[0] < 10)
    return;
    
    
    if ((Position.MarketPosition == MarketPosition.Flat)
    
    && ( Conditions ))
    {
    
    EnterLong(DefaultQuantity, "scalpLong");
    EnterLong(DefaultQuantity, "runnerLong");
    
    }
    
    
    if ((Position.MarketPosition == MarketPosition.Flat)
    
    && ( Conditions ))
    {
    
    EnterShort(DefaultQuantity, "scalpShort");
    EnterShort(DefaultQuantity, "runnerShort");
    
    }
    
    }
    
    
    protected override void OnExecutionUpdate(Execution execution, string executionId, double price, int quantity, MarketPosition marketPosition, string orderId, DateTime time)
    {
    
    
    if (execution.Order.Name == "scalpLong" && execution.Order.OrderState == OrderState.Filled)
    {
    
    ExitLongStopMarket(0, true, 1, execution.Order.AverageFillPrice - 17 * TickSize, "exitStopScalpLong", "scalpLong");
    ExitLongLimit(0, true, 1, execution.Order.AverageFillPrice + 7 * TickSize, "exitLimitScalpLong", "scalpLong");
    
    }
    
    
    if (execution.Order.Name == "runnerLong" && execution.Order.OrderState == OrderState.Filled)
    {
    
    ExitLongStopMarket(0, true, 1, execution.Order.AverageFillPrice - 17 * TickSize, "exitStopRunnerLong", "runnerLong");
    ExitLongLimit(0, true, 1, execution.Order.AverageFillPrice + 200 * TickSize, "exitLimitRunnerLong", "runnerLong");
    
    }
    
    if (execution.Order.Name == "scalpShort" && execution.Order.OrderState == OrderState.Filled)
    {
    
    ExitLongStopMarket(0, true, 1, execution.Order.AverageFillPrice - 17 * TickSize, "exitStopScalpShort", "scalpShort");
    ExitLongLimit(0, true, 1, execution.Order.AverageFillPrice + 7 * TickSize, "exitLimitScalpShort", "scalpShort");
    
    }
    
    
    if (execution.Order.Name == "runnerShort" && execution.Order.OrderState == OrderState.Filled)
    {
    
    ExitLongStopMarket(0, true, 1, execution.Order.AverageFillPrice - 17 * TickSize, "exitStopRunnerShort", "runnerShort");
    ExitLongLimit(0, true, 1, execution.Order.AverageFillPrice + 200 * TickSize, "exitLimitRunnerShort", "runnerShort");
    
    }
    
    }
    
    }
    }

    Leave a comment:


  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    I've added in a profit target with ExitLongLimit() to show how ExitLongLimit() is called.

    From the help guide on the Internal Order Handling rules I have linked in post #16:
    "Methods that generate orders to exit a position will be ignored if:
    •A position is open and an order submitted by an enter method (EnterLongLimit() for example) is active and the order is used to open a position in the opposite direction
    •A position is open and an order submitted by a set method (SetStopLoss() for example) is active"
    "Set() methods that generate orders to exit a position will be ignored if:
    •A position is open and an order submitted by an enter method (EnterLongLimit() for example) is active and the order is used to open a position in the opposite direction
    •A position is open and an order submitted by a non market order exit method (ExitLongLimit() for example) is active"

    This is stating that if you attempt to use an exit order after an set method that will be ignored. If you attempt to use a set method after an exit order, it will be ignored.

    You cannot use SetProfitTarget, SetTrailStop, or SetStopLoss or any set method if an exit order is working or vice versa. Entries also have their own handling rules listed above.

    Take a look at the ProfitChaseStopTrailExitOrdersExample_NT8 that was linked in post #8. This is a demonstration that places both the stop and the target using ExitLongStopMarket and ExitLongLimit() and be used to learn how to code something this. This also shows logic on how to move these, however you don't have to use that logic to move them, you can place them all them to sit and remove the logic that changes the prices.


    I am not able to debug your code, so I must guide with questions and answer any of your direct questions. Unfortunately, in the support department at NinjaTrader it is against our policy to create, debug, or modify, code or logic for our clients. Further, we do not provide C# programming education services or one on one educational support over the phone in our NinjaScript Support department. This is so that we can maintain a high level of service for all of our clients as well as our associates.

    We can provide demonstration example scripts for you to import and learn from. Links to educational material in the help guide and videos. We are also able to guide you through the debugging process to assist or building process of a specific script you are wanting to work out.

    You can also contact a professional NinjaScript Consultant who would be eager to create or modify this script at your request or assist you with your script. The NinjaTrader Ecosystem has affiliate contacts who provide educational as well as consulting services. Please let me know if you would like our NinjaTrader Ecosystem team follow up with you with a list of affiliate consultants who would be happy to create this script or any others at your request or provide one on one educational services.


    What I can do is answer any questions that you may have.

    Set methods are updated and controlled by NinjaTrader and updated anytime OnBarUpdates. This means that they will move back to their NinjaTrader calculated positions.
    Exit methods, however, will not move back to their NinjaTrader calculated positions. These do use the managed approach and have rules in respect to the position and other working orders. The strategy position is specifically updated from the OnExecutionUpdate event. This means that the strategy will not have the position open for the exit order to attach to and will be ignored.

    Enabling TraceOrders will allow to see when orders are being ignored and why.
    Below is a link to a forum post that demonstrates using TraceOrders and prints to understand what is happening with an order.
    https://ninjatrader.com/support/foru...121#post791121
    Attached Files

    Leave a comment:


  • coopgrafik
    replied
    Originally posted by NinjaTrader_ChelseaB View Post
    Are you testing just the stop loss and this is not filling when the price falls 7 ticks below the entry?
    I mean... I sent you my code so you can see exactly what andwhere I am I as I try to integrate your notes.

    When we began you can see I was using these three methods in unison and they are working with the exception that my stop loss, if moved my hand during a trade, would reset back to the coded position at the top of every OnBarUpdate.
    • SetProfitTarget();
    • SetStopLoss();
    • EnterLong();
    You told me I needed to use ExitLongStopMarket() and then followed on with the fact that it needs to be wrapped in the OnExecutionUpdate event listener. I have followed all the directions and not one single recommendation has worked for me.

    You are now bring up new issues and asking questions that I clearly don't have the answers for. I have humbly come here for help. My original request was, "Why does my stop loss keep snapping back to it's original place." As an expert with NinjaScript and knowing that I don't have a fluency with this library I think it would be helpful if you could use your expertise to holistically look at what I'm trying to accomplish and make a recommendation from that perspective.

    The code you sent over does not have a profit target so clearly I would have no way to tell if SetProfitTarget() is a method I could NOT use along with ExitLongStopMarket(). You are aware that I am using SetProfitTarget as I'm included sample code in my posts a coupe of time. This is nothing new.

    No where in the documentation on ExitLongStopMarket does it state that it's not compatible with SetProfitTarget. This is typical with the documentation. Never does it remotely suggest how these methods work together. Everything is so fragmented that it's impossible to tell what to do. Even the simplest note like SetStopLoss needs to be placed a line above EnterLong is just something I had to learn scouring through the forums. that's a critical piece of information and the expectation is that a new user will just figure that out on their own.


    What I'm trying to do is extremely basic. Ultimately I'm looking to place an ATM style split order (scalp + runner) with protection: stop loss and target. I feel like this is what everyone wants. We're all trying to emulate the way we actually trade.

    Again, if you can holistically look at what I'm trying to accomplish and make a recommendation that would be helpful. If there is example code for a split order with protection that would be extremely helpful.

    You are the expert. I don't know what I don't know but I have made my living as a developer and also own an advertising software company. I do understand software but this library and it's documentation leaves me with a lot of questions and dead ends.

    I respect your time and appreciate you help.








    Last edited by coopgrafik; 08-04-2021, 03:41 PM.

    Leave a comment:


  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    Your script will only have the stop loss fill and the exit order will be ignored, as you cannot use set methods and exit orders on the same order.

    This violates the internal order handling rules for the managed position.
    https://ninjatrader.com/support/help...antedPositions

    "Methods that generate orders to exit a position will be ignored if:
    •A position is open and an order submitted by an enter method (EnterLongLimit() for example) is active and the order is used to open a position in the opposite direction
    •A position is open and an order submitted by a set method (SetStopLoss() for example) is active"

    Enable the TraceOrders and you will get a message that the order was ignored, which would tell you what happened with the order.
    Please enable TraceOrders in State.Configure, then please provide the output from the output window.

    Are you testing just the stop loss and this is not filling when the price falls 7 ticks below the entry?
    Last edited by NinjaTrader_ChelseaB; 08-04-2021, 03:09 PM.

    Leave a comment:


  • coopgrafik
    replied
    Welp, I see it working for you but not for me. Can you have a look at my strategy and let me know what I'm doing wrong. I just don't see a difference. Thank you
    Attached Files

    Leave a comment:


  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    I overlooked the strategy position is not updated until the OnExecutionUpdate event.

    Attached is an example script and a short video showing it work.
    https://drive.google.com/file/d/1N3v...w?usp=drivesdk
    Attached Files

    Leave a comment:


  • coopgrafik
    replied
    Thanks again but I'm sorry to report that a stop is not being set. This is the set up I have below. I'm sorry I'm at a loss. See the screenshot attached and you can see how there is no stop being set.


    Code:
    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 (order.Name == "scalp")
    {
    ExitLongStopMarket(0, true, 1, order.AverageFillPrice - 17 * TickSize, "exit", "scalp");
    }
    
    }
    
    protected override void OnBarUpdate()
    {
    
    if (BarsInProgress != 0) return;
    if (CurrentBars[0] < 5) return;
    
    if ((Position.MarketPosition == MarketPosition.Flat)
    && (Close[0] > Close[1]))
    {
    SetProfitTarget("scalp", CalculationMode.Ticks, 7);
    EnterLong(DefaultQuantity * 2, "scalp");
    }
    
    }
    Attached Files

    Leave a comment:


  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    Apologies I was copying that from the previous post on nt7.

    That should be order.AverageFillPrice.

    if (order.Name == "scalp")
    {
    ExitLongStopMarket(0, true, 1, order.AverageFillPrice - 17 * TickSize, "exit", "scalp");
    }
    }

    Leave a comment:


  • coopgrafik
    replied
    Chelsea,

    When I copy and paste your code I get an error. Please see the screenshot. Not sure what to do. Please advise. Thank you.
    Attached Files

    Leave a comment:


  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    Set methods and exit methods work differently. A Set method would be called before the entry. The Exit method would be called after

    Further, you would not use both. You would use one or the other. The Set methods will revert back to the set price when OnBarUpdate runs, so you would not want to use these.

    Instead these would be called after the entry order OrderState is OrderState.Filled.

    Move the ExitLongStopMarket to OnOrderUpdate instead of OnBarUpdate.

    When the entry order, in OnOrderUpdate() is OrderState.Filled, call the ExitLongStopMarket() method.

    protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error, string nativeError)
    {
    // check if the current order matches the orderName passed in "EnterLong"()
    // Assign entryOrder in OnOrderUpdate() to ensure the assignment occurs when expected.
    // This is more reliable than assigning Order objects in OnBarUpdate, as the assignment is not guaranteed to be complete if it is referenced immediately after submitting
    (edited)
    if (order.Name == "scalp")
    {
    ExitLongStopMarket(0, true, 1, order.AverageFillPrice - 17 * TickSize, "exit", "scalp");
    }
    }

    Please let me know if this is not clear.
    Last edited by NinjaTrader_ChelseaB; 08-04-2021, 11:32 AM.

    Leave a comment:


  • coopgrafik
    replied
    Chelsea, Sorry for incorrectly posting in the NT7 forum.

    On the code below per your instruction I am using:
    • ExitLongStopMarket()
    • isLiveUntilCancelled = true
    • I have switch back to Position.AveragePrice
    However, the stops are not being set. Of course I have reviewed the documentation many times but it's not helpful if the method has 6 arguments but only provides this one very basic example: ExitLongStopMarket(stopPrice);

    I'm 53 and started coding in the early 80s but there is only so much I can do as the NT library is proprietary. I'm trying to understand.

    So I'm sorry I have to ask again. Can you explain why my stops are not being set with the code I've posted below. I'm doing everything I can on my part to be clear.


    Code:
    protected override void OnBarUpdate()
    {
    
    if (BarsInProgress != 0)
    return;
    
    if ((Position.MarketPosition == MarketPosition.Flat)
    
    && (Conditions))
    
    {
    
    SetProfitTarget("scalp", CalculationMode.Ticks, 7);
    ExitLongStopMarket(0, true, 1, Position.AveragePrice - 17 * TickSize, "exit", "scalp");
    EnterLong(DefaultQuantity * 2, "scalp");
    
    SetProfitTarget("runner", CalculationMode.Ticks, 100);
    ExitLongStopMarket(0, true, 1, Position.AveragePrice - 17 * TickSize, "exit2", "runner");
    EnterLong(DefaultQuantity, "runner");
    
    }
    Last edited by coopgrafik; 08-04-2021, 09:36 AM.

    Leave a comment:


  • NinjaTrader_ChelseaB
    replied
    Hello coopgrafik,

    This was posted in the NinjaTrader 7 Strategy Development section of the forums indicating this is for NinjaTrader 7. I have moved this thread to the NinjaTrader 8 Strategy Development section of the forums.
    https://ninjatrader.com/support/foru...gy-development


    Below are links to the NinjaTrader 8 help guide.
    https://ninjatrader.com/support/help...stopmarket.htm
    https://ninjatrader.com/support/help...erageprice.htm
    https://ninjatrader.com/support/help...rdirection.htm
    https://ninjatrader.com/support/help...rderupdate.htm

    As well as links to NinjaTrader 8 examples.
    https://ninjatrader.com/support/foru...596#post806596
    https://ninjatrader.com/support/foru...269#post802269


    Yes, this will work in NinjaTrader 8. Use ExitLongStopMarket() with isLiveUntilCancelled as true in OnOrderUpdate().
    EnterLongStopMarket(int barsInProgressIndex, bool isLiveUntilCancelled, int quantity, double stopPrice, string signalName)

    I am also including a link to a forum post with helpful information about getting started with NinjaScript and C#.
    https://ninjatrader.com/support/foru...040#post786040
    Last edited by NinjaTrader_ChelseaB; 08-04-2021, 08:18 AM.

    Leave a comment:

Latest Posts

Collapse

Topics Statistics Last Post
Started by tonynt, Today, 11:01 AM
0 responses
8 views
0 likes
Last Post tonynt
by tonynt
 
Started by newton1, Today, 09:54 AM
1 response
30 views
0 likes
Last Post AaronKoRn  
Started by leontancfa, Today, 08:50 AM
0 responses
26 views
0 likes
Last Post leontancfa  
Started by SuperDude123, Today, 08:31 AM
0 responses
33 views
0 likes
Last Post SuperDude123  
Started by thommo, Today, 05:26 AM
1 response
46 views
0 likes
Last Post NinjaTrader_ShawnB  
Working...
X