I've a question regarding the Simulation setting "SetSimSetting(_NbPositions,n)".
In my understanding the maximum number of positions should have no impact on the backtesting results, as long as I set it to the number of available time series in the backtest.
(e.g. 50 futures in backtests means at maximum 50 simultaneous positions)
I'm not sure why, but if I increase Nbpositions to 500 or 5000, the backtesting results show huge deviations even though the system can take 50 positions at max in theory.
Furthermore If I look at the "Number of positions" in the report overview it shows me a maximum of 10 simultaneous positions, so the simulation setting should have no impact as long as it is greater than 10.
I'm not sure if I got something wrong about "NbPositions", does anyone have an idea where this deviation in the backtests might result from?
"If you want to trade NASDAQ100 stocks and don't want to invest in more than 10 stocks at the same time then you should put 10 as number of positions.
Each position will get around 10% of the total capital. If you set the number of positions to 5 then each position will get around 20% of the total capital."
In my system the risk based position sizing is covered in the AMM. I assumed that an AMM script overrules the automatic allocation of capital by nbPositions. Obviously I'm wrong, as the total number of trades goes down if I increase nbPositions.
the AMM script I use updates the contracts to buy. Nevertheless does the setting NbPositions influence the backtesting results somehow.
To narrow it down, I created a new AMM script with a single line in the "OnNewPosition" event:
Functions.UpdateNumberOfShares(2);
I run the same backtest (in this case with 33 time series) 4 times and changed only the _NbPositions setting in the strategy tab. As you can see with an increasing _NbPositions setting the number of total trades goes down, even if the number of simultanoues trades if far below the setting.
SetSimSetting(_NbPositions,33); -> Trades: 1990, max number of simultaneous pos. from back test summary: 10
SetSimSetting(_NbPositions,50); -> Trades: 1990, max number of simultaneous pos. from back test summary: 10
SetSimSetting(_NbPositions,500); -> Trades: 1755, max number of simultaneous pos. from back test summary: 10
SetSimSetting(_NbPositions,5000): -> Trades: 717, max number of simultaneous pos. from back test summary: 6
Yes of course it would influence the result.
If you put 50 positions then it there is 50 positions that meet the buy condition on a specific bar, the "OnNewPosition" will be executed 50 times, unless the portfolio runs out cash. In that case, no more positions will be added.
If you put for example 50 positions, has 10000 as equity and execute this:
Functions.UpdateNumberOfShares(2000); // worth $10000
Then only one position will be taken as they will be no more cash to buy further positions.
Yes I understand that, but that's not the issue. The problem is that signals are not executed even if the number of open trades is far below nbPosition and enough cash is available. If the AMM takes care of the position sizing all signals should be passed to the AMM, as long as the maximum number of open trade is lower than nbPositions.
But that's obviously not the case:
If I set the initial equity to 10.000.000$
Functions.UpdateNumberOfShares(1);
and run the simulation with 33 futures
I get the following results:
nbPositions = 50 --> 1990 trades
nbPositions = 50000 --> 158 trades
In both cases nbPositions shouldn't be a limiting factor, as it will never be reached with 33 futures in simulation. But for whatever reason a higher nbPositions limits the execution of signals.
For me it looks as if the equity is divided by nbPosition for equal distribution and that this calculated value has to be greater than X of a new signal.
If this is correct, the question is what is X for stocks and what is X for futures (margin is set to 0 in the simulation) and shouldn't this check be turned off if the AMM defines the actual position size?
By setting a high number for nbPosition (50), I just wanted to ensure that all signal are going through and nothing is stopped by this setting.
Long story short: How can I ensure that the nbPosition setting doesn't limit my positions?
If you select "50000" as number of positions then each position will get a very small amount (in dollars). Since that amount is so small, you wouldn't be able to purchase even one share and that explains why there are so few trades. There is also min shares/value settings you can find here "Update Trading Systems -> Settings -> Capital".
Also there is a setting that you need to know about. It is used for optimization (memory) purposes.
Under the "Update Trading Systems -> Settings -> More Settings" button, you can specify the maximum number of signals to keep in memory.
I think I understand the logic. The question is whether it should be applied in all situations especially in future trading.
As of now the backtester cuts off 25% of the trades, in case a risk based position sizing model is applied in the AMM, because some rule says the equity isn't sufficient.
As the equity is a variable in the position sizing algorithm it wouldn%u2019t help just to increase the equity for simulation purposes.
The only way to ensure that all signals gets to a trade is to ignore the risk based position sizing and trade every position with one contract -> Functions.UpdateNumberOfShares(1).
Following the logic you described above, an initial equity of $500.000 and max position of 10 would lead to $50.000 for every potential future position.
For me the question is to what are those $50.000 compared, in case the backtester turns down a generated signal. Margin requirements would make sense, but they are all set to 0 in the backtests. It definitely doesn't make sense to compare it to the value of the contract.
For any asset that doesn't have margin requirements set, the number of shares is calculated based on the amount per position and the asset price.
If margin requirements are set then calculation is different.
If you want to analyze all signals, then either set a very high initial equity value or just check the signal in the AMM and accept or reject the ones you don't need. Not sure why you are putting a very high value in the number of positions (50000).
If you put $500.000 as initial equity and 10 as maximum position then all these 10 signals would be passed to AMM assuming you still have cash in your portfolio.
I used the high number of position to figure out what is happening, means for testing purposes only. In the real setup I'm using the number of futures in simulation (usually 50) as the number of open trades is already limited by a ranking function. But no matter if I use 10, 50 or 5000 as number of positions the signals are not executed.
I updated the margin deposit for all futures to "1" - no change. Please let me know how the calculation works if margin requirements are set.
"If you want to analyze all signals, then either set a very high initial equity value"
As the equity is part of the position size algorithm it doesn't help just to increase the initial equity, the system would just buy more contracts (tested with an initial equity up to $10.000.000.)
"or just check the signal in the AMM and accept or reject the ones you don\'t need."
How do I do that? As I don't reject any signal in the AMM, I assumed they never get to the AMM.
The only thing I want to achieve is that all signals are executed and are not limited by the nbPosition setting.
Can you please send us your trading system by email and tell us what exactly you are expecting?
When you say "But no matter if I use 10, 50 or 5000 as number of positions the signals are not executed", I am not sure what exactly you mean.
zero signals are executed? Just few? How many? Are you sure the "buy" rule generates many signals on that bar?
Trading financial instruments, including foreign exchange on margin, carries a high level of risk and is not suitable for all investors. The high degree of leverage can work against you as well as for you. Before deciding to invest in financial instruments or foreign exchange you should carefully consider your investment objectives, level of experience, and risk appetite. The possibility exists that you could sustain a loss of some or all of your initial investment and therefore you should not invest money that you cannot afford to lose. You should be aware of all the risks associated with trading and seek advice from an independent financial advisor if you have any doubts.