Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.
Good day everyone! Can you please advise how to set the deletion of an order in an EA?
The situation is as follows:
We place 2pending orders in different directions, as soon as one of them triggers, the other is removed and is no longer exhibited.
I would be very grateful for any help.
Thank you.
Something like this
for(int pos=OrdersTotal()-1,ticket=0,trade=0;pos!=-1;pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderType()>1)//Если найденный ордер отложенный { ticket=OrderTicket();//Запомним его тикет } else//Если ордер не отложенный { trade=1;//Запомним,что есть открытая позиция } if(ticket!=0 && trade==1)//И если известен отложенный и открыта позиция { int OD=OrderDelete(ticket);//Удаляем отложенный } }
Hi! Introduced a takeprofit trawl using the following algorithm:
if(total>0) {for (int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)==true) { if(OrderMagicNumber()==magic && OrderSymbol()==asset& OrderType()==OP_BUY) { RefreshRates(); if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600)) { TAKEPROFIT CONDITION; ORDER MODIFICATION TO A NEW TAKEPROFIT; } } } }
But the time limit doesn't work for some reason and it happens that if a position is not closed in the current timeframe, it also trawls in the next timeframe if the conditions are met.
Hello! I have introduced a takeprofit trawl using the following algorithm:
if(total>0) {for (int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)==true) { if(OrderMagicNumber()==magic && OrderSymbol()==asset && OrderType()==OP_BUY) { RefreshRates(); if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600)) { TRAILING TP CONDITION; { MODIFICATION OF THE ORDER TO THE NEW TAKEPROFIT; } } } }
But for some reason the time limit does not work, and it happens that if the position is not closed in the current timeframe, it trails in the next one too, if the conditions are met.
What is wrong with my last if()?
Well, I don't know, I have not seen anything wrong there yet. I have removed the redundant check on the number of orders (it is already present in the loop conditions) and added a check for both types of positions (Buy and Sell)
I don't know, I don't see what's wrong with it yet with a quick glance. I removed unnecessary check on number of orders (it is already there in cycle conditions) and added check on both types of positions (Buy and Sell)
Allow the use of cookies to log in to the MQL5.com website.
Please enable the necessary setting in your browser, otherwise you will not be able to log in.
You are signed in. Two-factor authentication has been disabled. Set it up again and scan a new QR code, or continue with two-factor authentication disabled.
I'm just learning, I'm trying to use the guide, but I realise I'm getting some nonsense, I'd like to see an example of how to do it.
Good day everyone! Can you please advise how to set the deletion of an order in an EA?
The situation is as follows:
We place 2pending orders in different directions, as soon as one of them triggers, the other is removed and is no longer exhibited.
I would be very grateful for any help.
Thank you.
Something like this
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderType()>1)//Если найденный ордер отложенный
{
ticket=OrderTicket();//Запомним его тикет
}
else//Если ордер не отложенный
{
trade=1;//Запомним,что есть открытая позиция
}
if(ticket!=0 && trade==1)//И если известен отложенный и открыта позиция
{
int OD=OrderDelete(ticket);//Удаляем отложенный
}
}
"Let's keep looking" needs to be removed!
You can edit your own posts on the forum. Everything you wrote in separate posts above can be fit into one.
Hi! Introduced a takeprofit trawl using the following algorithm:
if(total>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset& OrderType()==OP_BUY)
{
RefreshRates();
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
TAKEPROFIT CONDITION;
ORDER MODIFICATION TO A NEW TAKEPROFIT;
}
}
}
}
But the time limit doesn't work for some reason and it happens that if a position is not closed in the current timeframe, it also trawls in the next timeframe if the conditions are met.
What's wrong with my last if()?
Hello! I have introduced a takeprofit trawl using the following algorithm:
if(total>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset && OrderType()==OP_BUY)
{
RefreshRates();
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
TRAILING TP CONDITION;
{ MODIFICATION OF THE ORDER TO THE NEW TAKEPROFIT;
}
}
}
}
But for some reason the time limit does not work, and it happens that if the position is not closed in the current timeframe, it trails in the next one too, if the conditions are met.
What is wrong with my last if()?
Well, I don't know, I have not seen anything wrong there yet. I have removed the redundant check on the number of orders (it is already present in the loop conditions) and added a check for both types of positions (Buy and Sell)
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderType()>OP_SELL) continue;
if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
// УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
// МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
}
}
}
}
//+------------------------------------------------------------------+
Where // the trawl and modification conditions, insert Print() with the values of the time variables and see what the log says.
I don't know, I don't see what's wrong with it yet with a quick glance. I removed unnecessary check on number of orders (it is already there in cycle conditions) and added check on both types of positions (Buy and Sell)
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderType()>OP_SELL) continue;
if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
// УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
// МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
}
}
}
}
//+------------------------------------------------------------------+
Where // trawl and modification conditions, insert Print() with values of time variables and see what the log says.
I have different conditions for Sell, so I have only shown BUY.
" with time variables" - do you mean TimeCurrent()? Sorry if this surprises you - I am a zero-minus in programming.
And I do not understand this -OrderType()>OP_SELL. Why >? OrderType OP_SELL has value = 1 andOP_BUY = 0. Therefore it must be <= ? Thank you.
I have different trawl conditions for SELL, so I only showed BAI.
" with time variable values" - do you mean TimeCurrent()? Sorry if this surprises you - I'm a zero-minus in programming.
And I do not understand this -OrderType()>OP_SELL. Why >? OrderType OP_SELL has value = 1 andOP_BUY = 0. Therefore it must be <= ? Thank you.
Greetings. Could you please tell me why in the case of the following entry
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}
The system constantly generates errors
: invalid ticket for OrderDelete function
: OrderDelete error 4051
According to the reference book it is
Invalid value of the function parameter
Although the parameters seem to be the same.
Although if you remove the condition and leave only
OrderDelete(ticketD);
OrderDelete(ticketUP);
it deletes successfully (but I need it by condition). What am I doing wrong?
Greetings. Could you please tell me why in the case of the following entry
if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}
The system constantly generates errors
: invalid ticket for OrderDelete function
: OrderDelete error 4051
According to the reference book it is
Invalid value of the function parameter
Although the parameters seem to be the same.
Although if you remove the condition and leave only
OrderDelete(ticketD);
OrderDelete(ticketUP);
it deletes successfully (but I need it by condition). What am I doing wrong?