This is the second part of the "Trading Orders" article; you can read the first part here: Trading Orders.
In the last paragraph of the first part, we tried to respond to the question: Why are some signals rejected?
We introduced how signals are preceded and why some of them are rejected, we then talked about filters and how signals should pass these filters in order to be accepted.
Here is a list of the most important filters:
- There must be enough cash and available positions
- There is an opposite order. Example: The simulator has a signal to buy the stock "A" and at the same time, there is a pending order to sell the stock "A". In that particular case, the default behavior is to close the pending sell order and reject the current signal.
- The signal order must not exist in the re-enter stop list. This list is used to store securities that should not be entered for a specific number of bars after a previous stop for the same security was executed.
- The signal's security symbol should not exist in the buy pending order list, in case it is a buy signal.
- The signal’s security symbol should not exist in the portfolio
- The estimated order size should be higher than the minimum order size specified in the simulation settings
- The money management "OnNewPosition" event should not reject the signal
Once a signal is accepted, it is transferred to the orders factory, which will transform this signal into a trading order. The orders factory will reduce the amount of available cash by the order size and decrement the number of available positions by one. Note that, we can only get an approximate order size; this is because, if the order is for example "Buy at open, tomorrow" then we will not have access to the open price of tomorrow. Therefore, to resolve this issue we use the current close price to calculate the approximate order size.
Trading Orders Filters:
The next step is to execute these orders at the following period. First, the simulator will only try to execute orders that have no lag value. In fact, you can specify a lag value in an order (Buy at tomorrow + 2, create an order with a lag of 2), so that the order is executed only after the specified number in the lag field.
As with the transformation of signals to orders, the execution of orders is not always possible. Several things could prevent the simulator from executing an order. The simulator is able to simulate things as if the order is transmitted to a broker then to an exchange.
This is a non-exhaustive list of what can prevent an order from being executed:
- The order has a lag value. Therefore, it will not be executed at the current period. In this case, the lag value of the order is decremented by one at each period.
- The order is a limit order and the limit price is not reached. Example: You want to buy a stock for a price of 20$, but today low price is 21$.
- There are no market data for the order’s security (stock, futures, options…) at the current period.
- The security to be bought is a penny stock and the simulator settings is set to reject penny stocks
- There is no enough volume to buy the security.
You can update the last two filter settings by selecting a trading system, then clicking on "Update". Once the "Update Trading System" form appears, select "Settings" in the top menu then click on the "Capital" button.
Orders that are not executed are kept for five bars by default. This value can of course be changed by the user. An exit order behaves differently; after the default number of bars is exceeded, the order is automatically transformed into a market order so that the execution is guaranteed.