Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 30

 
yaaarik777:
Estou apenas aprendendo, estou tentando usar o guia, mas percebo que estou recebendo alguns disparates, gostaria de ver um exemplo de como fazê-lo.
Leia este artigo, ele será útilhttps://www.mql5.com/ru/articles/1399
События в МetaТrader 4
События в МetaТrader 4
  • 2006.05.29
  • Andrey Khatimlianskii
  • www.mql5.com
Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.
 
yaaarik777:

Bom dia a todos! Você pode aconselhar como definir a eliminação de um pedido em uma EA?

A situação é a seguinte:

Colocamos 2ordens pendentes em diferentes direções, assim que uma delas aciona, a outra é removida e não é mais exibida.

Eu ficaria muito grato por qualquer ajuda.

Obrigado.

Algo como isto

   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);//Удаляем отложенный
        }
     }
 
Nikolay Gaylis:
"Vamos continuar procurando" precisa ser removido!
Você pode editar suas próprias postagens no fórum. Tudo o que você escreveu em postos separados acima pode caber em um só.
 
Vitalie Postolache:
Você pode editar suas próprias postagens no fórum. Tudo o que você escreveu em posts separados acima pode caber em um só.
Obrigado!
 

Olá! Introduzimos uma rede de arrasto takeprofit usando o seguinte algoritmo:

if(total>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==verdadeiro)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset& OrderType()==OP_BUY)
{
RefreshRates();
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
TAKEPROFIT CONDITION;
MODIFICAÇÃO DO PEDIDO A UM NOVO TAKEPROFIT;
}
}
}
}

Mas o limite de tempo não funciona por alguma razão e acontece que se uma posição não for fechada no prazo atual, ela também arrasta no próximo prazo se as condições forem cumpridas.

O que há de errado com meu último if()?

 
владимир:

Olá! introduzi uma rede de arrasto takeprofit usando o seguinte algoritmo:

if(total>0)
{for (int i=OrdensTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==verdadeiro)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset && OrderType()==OP_BUY)
{
RefreshRates();
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
CONDIÇÃO DE TRAILING TP;
{ MODIFICAÇÃO DA ORDEM PARA O NOVO TAKEPROFIT;
}
}
}
}

Mas por alguma razão o limite de tempo não funciona, e acontece que se a posição não for fechada no período de tempo atual, ela também se arrasta no próximo, se as condições forem cumpridas.

O que há de errado com meu último if()?

Bem, eu não sei, ainda não vi nada de errado aí. Retirei a verificação redundante do número de pedidos (já está presente nas condições do loop) e acrescentei uma verificação para ambos os tipos de posições (Compra e Venda)

//+------------------------------------------------------------------+
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)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Onde // as condições de arrasto e modificação, insira Print() com os valores das variáveis de tempo e veja o que diz o registro.

 
Artyom Trishkin:

Não sei, ainda não vejo o que há de errado com isso com um olhar rápido. Removi verificação desnecessária do número de pedidos (já está lá em condições de ciclo) e acrescentei verificação em ambos os tipos de posições (Compra e Venda)

//+------------------------------------------------------------------+
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)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Onde // arrasto e condições de modificação, insira Print() com valores de variáveis de tempo e veja o que diz o registro.

Tenho condições diferentes para VENDER, por isso só mostrei COMPRAR.

" com variáveis de tempo" - você quer dizer TimeCurrent()? Desculpe se isto o surpreende - eu sou um zero-minus na programação.

E eu não entendo isto -OrderType()>OP_SELL. Por que >? OrderType OP_SELL tem valor = 1 eOP_BUY = 0, portanto deve ser <= ? Obrigado.

 
владимир:

Tenho diferentes condições de arrasto para a SELL, por isso só mostrei o BAI.

" com valores variáveis de tempo" - você quer dizer TimeCurrent()? Desculpe se isto o surpreende - eu sou um zero-minus na programação.

E eu não entendo isto -OrderType()>OP_SELL. Por que >? OrderType OP_SELL tem valor = 1 eOP_BUY = 0, portanto deve ser <= ? Obrigado.

Se o tipo for maior que 1, então vá para a próxima iteração do laço.
 

Saudações. Você poderia me dizer por que, no caso da seguinte entrada

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

O sistema gera constantemente erros

: bilhete inválido para a função OrderDelete

OrderDelete error 4051

De acordo com o livro de referência, é

Valor inválido do parâmetro de função

Embora os parâmetros pareçam ser os mesmos.

Embora se você remover a condição e deixar apenas

OrderDelete(ticketD);

OrderDelete(ticketUP);

ele apaga com sucesso (mas eu preciso dele por condição). O que eu estou fazendo de errado?

 
spoiltboy:

Saudações. Você poderia me dizer por que, no caso da seguinte entrada

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

O sistema gera constantemente erros

: bilhete inválido para a função OrderDelete

OrderDelete error 4051

De acordo com o livro de referência, é

Valor inválido do parâmetro de função

Embora os parâmetros pareçam ser os mesmos.

Embora se você remover a condição e deixar apenas

OrderDelete(ticketD);

OrderDelete(ticketUP);

ele apaga com sucesso (mas eu preciso dele por condição). O que eu estou fazendo de errado?

O erro está em algum lugar acima do código, na área de seleção de ordem.