Order OID0 is REJECTED with error "Relative stop loss has invalid precision"
Order OID0 is REJECTED with error "Relative stop loss has invalid precision"
10 Apr 2019, 08:29
I was running a bot today (and yesterday) in an IC Markets demo account that has been trying to purchase AUDJPY through cTrader.
I keep receiving the error message:
10/04/2019 10:00:02.217 | → Order OID0 is REJECTED with error "Relative stop loss has invalid precision"
The order I tried placing is as follows according to the cTrader log tab with the output my bot writes:
10/04/2019 10:00:02.233 | Execute Market Order NOT successful! H1 AUDJPY; Short Buy; 1,002; TSL in Pips:26.23000; Approx Time:20190410 10:03:15
string commentString = _positionLabel + "; Short Buy; " + String.Format("{0:#,###}", PositionSize) + "; TSL in Pips:" + String.Format("{0:#,###.00000}", _stopLossInPips) + "; Approx Time:" + DateTime.Now.ToString("yyyyMMdd HH:mm:ss"); TradeResult result = ExecuteMarketOrder(TradeType.Buy, Symbol, PositionSize, _positionLabel, _stopLossInPips, null, null, commentString, true);
It's trying to short 1002 units. The Trailing Stop loss (TSL) goes to 2 decimal places: 26.23.
Why is that stop loss being marked as "invalid precision" as the YEN goes to 2 decimal places when trading FOREX?
Thank you.
Replies
firemyst
11 Apr 2019, 03:05
RE:
Panagiotis Charalampous said:
Hi FireMyst,
Try to round the TSL to one decimal place.
Best Regards,
Panagiotis
Thank you. I will try it today and let you know.
I have a question though -- it works perfectly while backtesting. No orders rejected. Why would that be the case?
That seems like a big flaw and major functional inconsistency if we can submit orders with stop losses in pips with 2-4 decimal places while backtesting in a demo account, but they're rejected by the same broker when not backtesting in the same demo account.
@firemyst
firemyst
12 Apr 2019, 13:26
RE:
Panagiotis Charalampous said:
Hi FireMyst,
Try to round the TSL to one decimal place.
Best Regards,
Panagiotis
Rounding the Stop Loss to 1 decimal point worked.
It still doesn't answer the question though -- why does it work in backtesting?
If such functionality isn't going to work in a "live" account, it shouldn't work while backtesting in a demo account.
Is this a cTrader bug or known issue?
@firemyst
PanagiotisCharalampous
14 Apr 2019, 13:12
Hi FireMyst,
Backtesting is a simulation of the trading on your machine. It does not communicate with the server and it does not account for all possible parameretes of a cBot's runtime. The specific error is sent by the server where the checks are a bit more strict. I would advise you to test your cBots on a demo account as well before moving to a live trading account.
Best Regards,
Panagiotis
@PanagiotisCharalampous
thomas.abele
01 Jan 2020, 12:08
RE: precision if stopLoss or takeProfit is specified in pips
PanagiotisCharalampous said:
Hi FireMyst,
Backtesting is a simulation of the trading on your machine. It does not communicate with the server and it does not account for all possible parameretes of a cBot's runtime. The specific error is sent by the server where the checks are a bit more strict. I would advise you to test your cBots on a demo account as well before moving to a live trading account.
Best Regards,
Panagiotis
Hi Panagiotis,
I saw for most Symbols the precision for stopLoss or takeProfit specified in pips is 1 digit. But for e.g. XAUUSD it is 0 digits.
Is there a way to find out programatically what the precision is?
Kind Regards,
Thomas
@thomas.abele
firemyst
02 Jan 2020, 05:22
RE: RE: precision if stopLoss or takeProfit is specified in pips
thomas.abele said:
PanagiotisCharalampous said:
Hi FireMyst,
Backtesting is a simulation of the trading on your machine. It does not communicate with the server and it does not account for all possible parameretes of a cBot's runtime. The specific error is sent by the server where the checks are a bit more strict. I would advise you to test your cBots on a demo account as well before moving to a live trading account.
Best Regards,
Panagiotis
Hi Panagiotis,
I saw for most Symbols the precision for stopLoss or takeProfit specified in pips is 1 digit. But for e.g. XAUUSD it is 0 digits.
Is there a way to find out programatically what the precision is?
Kind Regards,
Thomas
@Thomas:
Is Symbol.Digits what you're looking for? https://ctrader.com/api/reference/internals/symbol
@firemyst
MegaCynic
02 Mar 2022, 14:15
RE: RE: RE: precision if stopLoss or takeProfit is specified in pips
firemyst said:
Is Symbol.Digits what you're looking for? https://ctrader.com/api/reference/internals/symbol
I'm running into the same problem right now and I don't see any value that would tell me at what precision to round the StopLoss/TakeProfit values.
Symbol.TickSize is 1/ 10^Symbol.Digits for all symbols I've checked, which is at least one off for most, but sometimes even more. The UI seems to have the information somewhere, as for a manual trade you can't enter more precision than allowed. I'd love to know what it uses.
Thanks, Rolf.
@MegaCynic
amusleh
03 Mar 2022, 08:26
Hi,
Try this:
using System;
using cAlgo.API;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class NewcBot : Robot
{
[Parameter(DefaultValue = 10.5678)]
public double Pips { get; set; }
protected override void OnStart()
{
Print(NormalizePips(Pips));
}
private double NormalizePips(double pips)
{
var currentPrice = Convert.ToDecimal(Symbol.Bid);
var pipSize = Convert.ToDecimal(Symbol.PipSize);
var pipsDecimal = Convert.ToDecimal(pips);
var pipsAddedToCurrentPrice = Math.Round((pipsDecimal * pipSize) + currentPrice, Symbol.Digits);
var tickSize = Convert.ToDecimal(Symbol.TickSize);
var result = (pipsAddedToCurrentPrice - currentPrice) * (tickSize / pipSize * Convert.ToDecimal(Math.Pow(10, Symbol.Digits)));
return decimal.ToDouble(result);
}
}
}
It can normalize any Pips number to something that you can use as a stop loss or take profit.
It should work for all symbols.
@amusleh
MegaCynic
04 Mar 2022, 23:17
RE: Pip rounding
Thank you @amusleh for that code snippet. I've missed taking pipSize into account.
Do you know of any case where Symbol.TickSize is not 1/Math.Pow(10, Symbol.Digits)? The Remarks for the TickSize description makes me think it always is (which would allow us to simplify the result calculation).
@MegaCynic
PanagiotisCharalampous
10 Apr 2019, 18:28
Hi FireMyst,
Try to round the TSL to one decimal place.
Best Regards,
Panagiotis
@PanagiotisCharalampous