-
Please edit your (original) post and use the CODE button (or Alt+S)! (For large amounts of code, attach it.)
General rules and best pratices of the Forum. - General - MQL5 programming forum #25 (2019)
Messages Editor
Forum rules and recommendations - General - MQL5 programming forum (2023) -
You select by ticket. You must check if the ticket has already closed (or still pending).
-
You used NormalizeDouble, Its use is usually wrong, as it is in your case.
-
Floating point has an infinite number of decimals, it's you were not understanding floating point and that some numbers can't be represented exactly. (like 1/10.)
Double-precision floating-point format - Wikipedia, the free encyclopediaSee also The == operand. - MQL4 programming forum (2013)
-
Print out your values to the precision you want with DoubleToString - Conversion Functions - MQL4 Reference.
-
SL/TP (stops) need to be normalized to tick size (not Point) — code fails on non-currencies.
On 5Digit Broker Stops are only allowed to be placed on full pip values. How to find out in mql? - MQL4 programming forum #10 (2011)And abide by the limits Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial and that requires understanding floating point equality Can price != price ? - MQL4 programming forum (2012)
-
Open price for pending orders need to be adjusted. On Currencies, Point == TickSize, so you will get the same answer, but it won't work on non-currencies. So do it right.
Trailing Bar Entry EA - MQL4 programming forum (2013)
Bid/Ask: (No Need) to use NormalizeDouble in OrderSend - MQL4 programming forum (2012) -
Lot size must also be adjusted to a multiple of LotStep and check against min and max. If that is not a power of 1/10 then NormalizeDouble is wrong. Do it right.
(MT4 2013)) (MT5 2022)) -
MathRound() and NormalizeDouble() are rounding in a different way. Make it explicit.
MT4:NormalizeDouble - MQL5 programming forum (2017)
How to Normalize - Expert Advisors and Automated Trading - MQL5 programming forum (2017) -
Prices (and lots) you get from the terminal are already correct (normalized).
-
PIP, Point, or Tick are all different in general.
What is a TICK? - MQL4 programming forum (2014)
-
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello,
I copied myOrderClose and adjusted it to look like below. Why? because trying to use myOrderClose for one order just closes the whole lot.
Problem is that when I call myCloseOneOrder() it completes, verified with Print() and then something else goes and closes everything else anyway.
The wish is to only close the one SELL/BUY order, not the whole lot.
All the BUY/SELL trades are on one symbol(EURUSD) but they were opened at different times and I want to close one specific on of those. That is what I think I'm doing...
Please help me understand how this hangs together.
void myCloseOneOrder(int orderTicket)
{
if(!IsTradeAllowed()) {
return;
}
bool success = false;
int retries = 0;
int err = 0;
int volumepercent = 100;
if(OrderSelect(orderTicket,SELECT_BY_TICKET,MODE_TRADES)==true) {
success = false;
retries = 0;
double price = (OrderType() == OP_SELL) ? Ask : Bid;
double volume = NormalizeDouble(OrderLots()* 100 * 1.0 / 100, LotDigits);
while(!success && retries < OrderRetry+1) {
success = OrderClose(orderTicket, volume, NormalizeDouble(price, Digits()), MaxSlippage, clrWhite);
if(!success)
{
err = GetLastError();
myAlert("print", "OrderClose "+orderTicket+" failed; error #"+IntegerToString(err)+" "+ErrorDescription(err));
Sleep(OrderWait*1000);
}
retries++;
}
if(!success)
{
myAlert("error", "OrderClose "+orderTicket+" failed "+IntegerToString(OrderRetry+1)+" times; error #"+IntegerToString(err)+" "+ErrorDescription(err));
return;
}
}
}