O grande e terrível MT4 para sempre (ou como fazer uma transição estratégica) - página 14

 
Ihor Herasko:

Sim, esse também é o meu ponto de vista. Acontece que o roteiro consegue fechar uma das posições, quando na verdade são duas, mas PositionsTotal() retorna 1. E então, após fechar, a condição final do loop é satisfeita, ou seja, PositionsTotal() retorna 2.

Você pode inserir impressões para ver completamente o que está acontecendo.

 
fxsaber:

As impressões podem ser inseridas para ver completamente o que está acontecendo.

Sim, para confirmar que o raciocínio está correto:

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      
Print("Открытие. PositionsTotal: ", PositionsTotal()); 
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Resultado:

2021.05.05 10:11:43.393 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.488 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.535 Test (EURUSD,M1)        CTrade::OrderSend: market sell 0.01 position #2249868517  EURUSD [position closed]
2021.05.05 10:11:43.535 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.615 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.697 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.777 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.859 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.941 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:44.023 Test (EURUSD,M1)        Открытие. PositionsTotal: 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

Na verdade, a posição é deixada sozinha pendurada.

P. S. Corrigi o correio, porque coloquei a coisa errada no código por causa da cópia cola.
 
Ihor Herasko:

Na verdade, a posição foi deixada sozinha pendurada.

No registro, é provável que o tempo de gravação do último negócio siga o tempo de gravação do fechamento do roteiro.

Também é importante imprimir EncomendasTotal.
 
fxsaber:

No registro, é provável que a hora do último registro comercial siga a hora do registro de fechamento do roteiro.

Você está se referindo a esses dois registros?

2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

Acho que tudo está correto aqui em termos de pedidos. De fato, existem duas posições, mas PositionsTotal() ainda não recebeu uma atualização. Portanto, ele retorna 1 e a posição é fechada. E depois que a operação comercial é executada, ela é atualizada para o estado que corresponde ao que existia antes da operação comercial ser executada. Então, obtemos 2.

 
fxsaber:

O problema já vem sendo discutido há muito tempo. Quase todos já o encontraram. É a primeira vez que um código reprodutível estável é encontrado.

Foi encontrada uma solução.

E qual é a solução?

Qual foi a dificuldade em encontrar um código de reprodução estável? Uma ação para abrir ou fechar, e a seguinte com uma decisão baseada no número de posições no mercado ou na história.
 
Ihor Herasko:

Você está se referindo a essas duas entradas?

Não, o último registro de atividade comercial está no segundo registro.

 
fxsaber:

Também é importante imprimir EncomendasTotal.

Acrescentei as impressões digitais. Agora restam duas posições, como esperado:

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Resultado:

2021.05.05 10:22:50.583 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.663 Test (EURUSD,M1)        После открытия. PositionsTotal: 0, OrdersTotal: 1
2021.05.05 10:22:50.679 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Dmitry Fedoseev:

Qual é a solução?

no número de posições no mercado ou na história.

Não houve dificuldade, eu escrevi na mosca.

 

Abre posições como esta sem parar de forma alguma

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(!Ordertotal)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

Foto por

 
SanAlex:

Abre posições como esta sem parar de forma alguma

Bem, quem vai atualizar o total? ))

Razão: