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.
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>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
Print("Открытие. PositionsTotal: ", PositionsTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
Resultado:
2021.05.0510:11:43.393 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.488 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.535 Test (EURUSD,M1) CTrade::OrderSend: market sell 0.01 position #2249868517 EURUSD [position closed]
2021.05.0510:11:43.535 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.615 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.697 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.777 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.859 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.941 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:44.023 Test (EURUSD,M1) Открытие. PositionsTotal: 12021.05.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510: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.
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.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510: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.
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.
Acrescentei as impressões digitais. Agora restam duas posições, como esperado:
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!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.0510:22:50.583 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.663 Test (EURUSD,M1) После открытия. PositionsTotal: 0, OrdersTotal: 12021.05.0510:22:50.679 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) После открытия. PositionsTotal: 2, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) Выход. PostionsTotal: 2
#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int total=PositionsTotal();
int Ordertotal=OrdersTotal();
while(!IsStopped() && (total <= 1)) // Закончим, когда появится более одной позиции.if(total == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif(!Ordertotal)
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
//+------------------------------------------------------------------+
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.
As impressões podem ser inseridas para ver completamente o que está acontecendo.
Sim, para confirmar que o raciocínio está correto:
Resultado:
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.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.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?
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.
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.Você está se referindo a essas duas entradas?
Não, o último registro de atividade comercial está no segundo registro.
Também é importante imprimir EncomendasTotal.
Acrescentei as impressões digitais. Agora restam duas posições, como esperado:
Resultado:
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
Abre posições como esta sem parar de forma alguma
Bem, quem vai atualizar o total? ))