Discussão do artigo "Biblioteca para desenvolvimento fácil e rápido de programas para a MetaTrader (parte VIII): Eventos de modificação de ordens e posições" - página 3

 
leonerd:

Quando um tique é recebido, no qual uma ordem pendente é definida e simultaneamente ativada (acionada) (testei com Buy Stop), seu mecanismo não registra todos os eventos...

O evento TRADE_EVENT_PENDING_ORDER_PLASED é recebido, mas não o TRADE_EVENT_PENDING_ORDER_ACTIVATED.

Meu código é mais ou menos assim:

Primeiro localizo o índice do evento antigo (processado) no loop e, a partir dele, percorro todos os novos até o final. Assim, em uma situação em que, em um tick, uma ordem de limite é definida e o striggeren recebe um evento sobre a definição... Por favor, comente.

Eu chamo ProcessTradeEvents() em OnTick() depois de engine.OnTick(rates_data).

A ordem foi colocada por seu mecanismo. Talvez eu ainda o tenha chamado quando não havia ativação ainda..... Vou verificar isso com uma ordem manual agora.

 
leonerd:

O pedido foi feito por seu próprio mecanismo. Talvez eu ainda o tenha chamado quando não havia ativação ainda..... Vou verificar com um pedido manual agora.

Sim, acho que são minhas mãos que estão tortas....

 
leonerd:

Sim, acho que minhas mãos estão tortas...

Não, está na biblioteca. Para ser mais preciso, não é na biblioteca, mas na peculiaridade de registrar o histórico de pedidos no terminal. Em versões posteriores da biblioteca, esse recurso é levado em consideração e tudo é rastreado corretamente. Experimente as versões por volta do dia 30 - antes do tópico sobre indicadores. Não me lembro onde isso foi corrigido agora. No entanto, escrevi sobre isso em um artigo posterior - houve uma correção lá.
 

Olá.

Encontrei este problema ao testar o TestDoEasyPart08.mq5 - o StopLoss e o TakeProfit não funcionam. Embora estejam definidos, as linhas correspondentes aparecem no gráfico e são enviadas mensagens para o diário. Se você ativar o TrailStop, o TakeProfit é acionado, mas o StopLoss ainda não. Qual pode ser o motivo?

P.S. Executei o mesmo código em outro computador (laptop) e ele funciona bem. Embora o mesmo metatrader esteja instalado lá.

 
MQL_User #:

Olá.

Encontrei este problema ao testar o TestDoEasyPart08.mq5 - o StopLoss e o TakeProfit não funcionam. Embora estejam definidos, as linhas correspondentes aparecem no gráfico e são enviadas mensagens para o diário. Se você ativar o TrailStop, o TakeProfit é acionado, mas o StopLoss ainda não. Qual pode ser o motivo?

P.S. Executei o mesmo código em outro computador (laptop) e ele funciona bem. Embora o mesmo metatrader esteja instalado lá.

Boa noite! Antes de mais nada, mostre pelo menos as mensagens que aparecem no registro.

Atenciosamente, Vladimir.

 
MQL_User #:

Olá.

Encontrei este problema ao testar o TestDoEasyPart08.mq5 - o StopLoss e o TakeProfit não funcionam. Embora estejam definidos, as linhas correspondentes aparecem no gráfico e são enviadas mensagens para o diário. Se você ativar o TrailStop, o TakeProfit é acionado, mas o StopLoss ainda não. Qual pode ser o motivo?

P.S. Executei o mesmo código em outro computador (laptop) e ele funciona bem. Embora o mesmo metatrader esteja instalado lá.

Se forem colocadas ordens stop (limite), seu acionamento não dependerá do programa, mas da corretora. A ordem para definir ordens stop (limite) é enviada ao servidor pelo programa, e seu acionamento depende da corretora. Como elas são colocadas (suas linhas são exibidas no gráfico), não há erros por parte do programa. O mais provável é que o preço não atinja as ordens stop (limite).

 
MrBrooklin #:

Boa noite, pelo menos mostre as mensagens que são registradas.

Saudações, Vladimir.

MrBrooklin, Artem.

Fiz isso no testador de estratégia (pelo que entendi, o corretor não tem nada a ver com isso).

As mensagens são as seguintes:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 deal #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 deal performed [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 order performed buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011]

Mas em outro computador (laptop), no qual o StopLoss e o TakeProfit funcionam corretamente, as mensagens são as seguintes:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 ordem executada buy 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Posição aberta: 2022.01.03 07.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Opened 0.10 Buy #2 [0.10 Market order Buy #2] at 81047, sl 80996, tp 81096, magik 123

De fato, mais duas linhas...

Para simplificar um pouco as coisas, escrevi um Expert Advisor com esse código simples:

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
#import "user32.dll"
  int GetAsyncKeyState(int a0);
#import
bool ZPressed, ZPress = false;
bool APressed, APress = false;
CTrade trade;

int OnInit()  {   return(INIT_SUCCEEDED);  }

void OnDeinit(const int reason)  {  }

void OnTick()
  {
  // O botão "Z" é pressionado
  if(MathAbs(GetAsyncKeyState(90))>1) ZPressed = ZPress = true;
  else ZPress = false;
  if(ZPressed && !ZPress)
    {
    ZPressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price - 30, tp = Price + 50;
    trade.Buy(1,Symbol(),0,sl,tp);
    printf("Buy"); 
    }
  // O botão "A" é pressionado
  if(MathAbs(GetAsyncKeyState(65))>1) APressed = APress = true;
  else APress = false;
  if(APressed && !APress)
    {
    APressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price + 30, tp = Price - 50;
    trade.Sell(1,Symbol(),0,sl,tp);
    printf("Sell");    
    }
  }

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {  }
//+------------------------------------------------------------------+

A questão é que, quando você pressiona (ou melhor, quando solta) a tecla "Z", ele abre a opção Buy, e quando você pressiona a tecla "A", ele abre a opção Sell.

Eu o executei no testador. O resultado é o mesmo: em um PC desktop, StopLoss e TakeProfit não funcionam, mas em um laptop, sim, ou seja, tudo funciona corretamente.

Também tentei executar o código vinculado no final deste artigo no testador em um PC e em um laptop, e aconteceu a mesma coisa - não funciona em um PC, mas em um laptop funciona.

Portanto, a conclusão é que ou há alguma configuração no testador que permite acionar sl e tp (que eu desconheço) ou o testador em si não está funcionando corretamente....

 
MQL_User #:

MrBrooklin, Artem.

Fiz isso no testador de estratégia (pelo que entendi, o corretor não tem nada a ver com isso).

As mensagens são as seguintes:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 deal #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 negócio realizado [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 ordem realizada buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011]

Mas em outro computador (laptop), no qual o StopLoss e o TakeProfit funcionam corretamente, as mensagens são as seguintes:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 ordem executada buy 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Posição aberta: 2022.01.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Open 0.10 Buy #2 [0.10 Market order Buy #2] at 81047, sl 80996, tp 81096, magik 123

De fato, mais duas linhas...

Para simplificar um pouco as coisas, escrevi um Expert Advisor com este código simples:

A questão é que, quando você pressiona (ou melhor, quando solta) a tecla "Z", ela abre a opção de compra e, quando você pressiona a tecla "A", ela abre a opção de venda.

Eu o executei no testador. O resultado é o mesmo: em um PC de mesa, StopLoss e TakeProfit não funcionam, mas em um laptop, sim, ou seja, tudo funciona corretamente.

Também tentei executar o código vinculado no final deste artigo no testador, tanto no PC quanto no laptop, e aconteceu a mesma coisa - no PC não funciona, mas no laptop funciona.

Portanto, a conclusão é que há alguma configuração no testador que permite acionar sl e tp (que eu não conheço) ou o próprio testador funciona incorretamente....

Qual é a propagação no testador?
 

O spread no testador é de 1. Tanto no PC quanto no laptop. Símbolo @Si.

Há alguma maneira de afetar isso?

Pensei que talvez a derrapagem (slippage) afetasse de alguma forma e tentei alterá-la. Mas isso não funciona.

 
MQL_User #:

O spread no testador é de 1. Tanto no PC quanto no laptop. Símbolo @Si.

Isso pode ter algum efeito?

Pensei que talvez o deslizamento (slippage) estivesse afetando-o de alguma forma e tentei alterá-lo. Mas isso não funciona.

Em um dos casos, o preço não atinge o nível de parada.