Topics
Replies
ncel01
17 Jul 2023, 12:06
( Updated at: 17 Jul 2023, 12:33 )
Yes, I can confirm that swaps have not been included for indices when backtesting.
Unfortunately, this is just another example where, unlike forex, indices have been overlooked.
@Spotware
Why do you need the cBot code here?
Just run a backtest with any indice and you will get to the same conclusion. As simple as that.
@ncel01
ncel01
14 Jul 2023, 10:26
Hi Panagiotis,
No, I don't think so. This was the first option I've checked, I guess.
It returns NullReference since no order/position took place. This is the problem here. Apparently, there is no way to access to the operation parameters when trade result is not successful.
@ncel01
ncel01
14 Jul 2023, 09:49
firemyst,
Thanks for your reply.
What I really need is to identify the respective trade operation when trade result is not successful.
I have an auxiliary variable aux[i] that will be set to true before ExecuteMarketOrderAsync(), and I want it to be false in case trade result is not successful. However, I need to exactly know what is the applicable index "i", which can only be taken from the operation label.
I am affraid that the only way to get this done is to create several callback functions from 0 to i_max, and define multiple ExecuteMarketOrderAsync() inside a switch case, each of these with its own callback function as argument.
@ncel01
ncel01
30 Jun 2023, 18:54
Hello,
The most likely reason why no trades are being placed:
When there are no open positions, Account.MarginLevel == null, which has a logic value eqivalent to !Account.MarginLevel.HasValue, as it assumes an infinite (NaN) value, therefore, both the conditionals Account.MarginLevel >= MarginRequirement and Account.MarginLevel.HasValue are false.
Try one of the following options, they must be equivalent:
if (Account.MarginLevel >= MarginRequirement || Account.MarginLevel == null)
// place a trade
}
else
{
// do not place a trade
}
Alternative:
if (Account.MarginLevel >= MarginRequirement || !Account.MarginLevel.HasValue)
// place a trade
}
else
{
// do not place a trade
}
@ncel01
ncel01
28 Jun 2023, 16:39
RE:
Dear Spotware team,
That was not expected but it's clear.
Thanks for informing!
Spotware said:
Dear ncel01,
At the moment market hours and margin are not consider. Both features will be added in a future release. In the meanwhile, please add manual checks before placing a trade.
Best regards,
cTrader Team
@ncel01
ncel01
28 Jun 2023, 10:28
firemyst,
That doesn't answer to my question.
The above has nothing to do with my cBot code. It is only meant to report the issues described.
why aren't you testing margin levels in your code _before_ sending the execute order?
I could also always check if market is open before I place a trade, however that's not the point here.
The order execution is instantaneous when backtesting, but not in real time, while dynamics apply to both cases. However, in the last case, a position will never open if the calculated account margin level after it opens is <100% and, the same should apply to the backtesting.
The requirements to place an order, among other, when backtesting should be exactly the same as when you're running your code in real time. Uniformity between these cases is not something you must code.
In fact, margin and market hours are the most basic requirements in training when it comes to open a trade. Therefore, it gets hard to understand why these are dismissed when backtesting.
@ncel01
ncel01
22 Jun 2023, 14:34
Hello,
1. The limits are per trader connection.
Per cTrader ID (user) or, per cTrader running instance/account? This is not clear to me.
2. The limits have not been imposed on live trading accounts yet but they might be imposed if deemed necessary.
Right. In such a case will this be explicitly announced? In advance?
As far as I can see, restrictions are completely unbalanced with regard to their the purpose, where the allowed rate for very likely operations is only 5% ( max. of 100 vs 2000 requests per min.) of that for not so likely operations.
Example:
ModifyPendingOrder(): Very likely to be used more that 100x/min. when managing multiple pending orders OnBar()/OnTick() to avoid any market orders.
ClosePosition()/ModifyPosition(): Not likely at all to be called 2000x/min.
3.
Is in Spotware's plans to effectively improve it's applications performance in parallel with such restrictions?
I believe that such restrictions can remediate any existing problem but will not solve it.
Thanks for informing.
@ncel01
ncel01
21 Jun 2023, 16:55
( Updated at: 21 Jun 2023, 16:59 )
Dear Spotware team,
Thanks for arranging this info. It is important for traders to be aware of such limitations.
As far as I can see, these limits are only applicable to demo accounts.
1. Are these the overall (cTrader ID) limits or, are these the limits per trading account?
2. Do any limits apply to live accounts?
Thank you.
@ncel01
ncel01
19 Jun 2023, 10:17
Dear Spotware team,
You're welcome!
Please be aware that, most probably, this is not the only case for which visual and non-visual backtest are providing different results.
Question:
What priority is given, by the the API, to the events when this occur at the exact same moment?
In my case, I need to be aware of this so that the correct cBot logic can be implemented.
Thanks.
@ncel01
ncel01
15 Jun 2023, 20:35
Panagiotis,
After investigating further what could be the reason for this issue, I was able to generate a simple cBot sampe that will allow anyone to reproduce it, I believe (comments included):
using System;
using cAlgo.API;
namespace cAlgo.Robots
{
[Robot(AccessRights = AccessRights.None)]
public class SamplecBot : Robot
{
// --> STEP NOT WORKING PROPERLY ( A step of 0.1 instead of 0.01 is being applied to this parameter ! )
[Parameter("Volume in lots :", DefaultValue = 0.01, MinValue = 0.01, Step = 0.01)]
public double VolumeInLots { get; set; }
protected override void OnStart()
{
Positions.Opened += Positions_Opened;
PlacePendingOrder();
}
private void Positions_Opened(PositionOpenedEventArgs obj)
{
if (Positions.Count < 10)
PlacePendingOrder();
}
private void PlacePendingOrder()
{
var direction = TradeType.Buy;
var volume = Symbol.QuantityToVolumeInUnits(VolumeInLots);
var distanceInPips = 50;
var entryPrice = direction == TradeType.Buy ? Symbol.Ask - distanceInPips * Symbol.PipSize : Symbol.Bid + distanceInPips * Symbol.PipSize;
var stopLossInPips = 50;
var takeProfitInPips = 50;
PlaceLimitOrder(direction, SymbolName, volume, entryPrice, null, stopLossInPips, takeProfitInPips);
}
protected override void OnTick()
{
// Below is the reason why visual and non-visual mode deliver different results when backtesting
// It seems like there is an overlap of the trading events ( Positions_Opened() and OnTick() ) when not in visual mode
// It also seems that OnTick() is called multiple times and that this value is increasing by 1 each time
// Multiple pending orders are being placed : the number of "same" positions is getting cumulative ( see Entry Time in history tab )
// Entry Time A: 1 position is opened
// Entry Time B: 2 positions are opened
// Entry Time C: 3 positions are opened
// Entry Time D: 4 positions are opened
// Etc.
if (PendingOrders.Count == 0)
PlacePendingOrder();
}
}
}
@ncel01
ncel01
15 Jun 2023, 15:09
( Updated at: 15 Jun 2023, 15:10 )
Hi Panagiotis,
Yes, I understand.
I am still trying to figure out what can be the problem but it should not be related to my code.
I suspect this is related to the way the trading events are handled.
Are you aware how priority on execution is assigned to the events in case these are triggered at the exact same moment? For instance: OnBar(), Positions_Opened(), Positions_Closed(), etc.
I still can try to create a bot sample that reproduces this behaviour so this can be further checked.
Thank you!
@ncel01
ncel01
06 Jun 2023, 12:16
firemyst,
I understand.
Unfortunately, unlike Forex, min. trading quantities on indices are not standardized among all the brokers, making it a real "salad".
However, some (few) brokers allow quantities as from 0.01 lots/units on these instruments. Still far below 0.1.
@ncel01
ncel01
17 Jul 2023, 13:26
Dear Spotware team,
Great. Thanks for the prompt action/feedback!
@ncel01