La grande et terrible MT4 pour toujours (ou comment organiser une transition) - page 14

 
Ihor Herasko:

Oui, c'est aussi mon avis. Il s'avère que le script parvient à fermer une des positions, alors qu'il y en a en fait deux, mais PositionsTotal() renvoie 1. Et ensuite, après la fermeture, la condition de fin de boucle est remplie, c'est-à-dire que PositionsTotal() renvoie 2.

Vous pouvez insérer des impressions pour bien voir ce qui se passe.

 
fxsaber:

Il est possible d'insérer des impressions pour bien voir ce qui se passe.

Oui, pour confirmer que le raisonnement est correct :

#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());
}

Résultat :

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

En fait, la position est laissée en suspens.

P. S. Corrigé le post, car j'ai mis la mauvaise chose dans le code à cause du copier-coller.
 
Ihor Herasko:

En fait, la position a été laissée en suspens.

Dans le journal, il est probable que l'heure d'enregistrement de la dernière transaction suive l'heure d'enregistrement de la clôture du script.

Il est également important d'imprimer OrdersTotal.
 
fxsaber:

Dans le journal, il est probable que l'heure du dernier enregistrement de transaction suive l'heure de l'enregistrement de clôture du script.

Faites-vous référence à ces deux entrées ?

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

Je pense que tout est correct ici en termes de commande. Il y a en fait deux postes mais PositionsTotal() n'a pas encore reçu de mise à jour. Par conséquent, il renvoie 1 et la position est fermée. Et après l'exécution de l'opération commerciale, il est mis à jour dans l'état qui correspond à celui qui existait avant l'exécution de l'opération commerciale. Donc, on obtient 2.

 
fxsaber:

Le problème est discuté depuis longtemps. Presque tout le monde l'a rencontré. C'est la première fois qu'un code stable et reproductible a été trouvé.

Une solution a été trouvée.

Et quelle est la solution ?

Quelle a été la difficulté de trouver un code reproductible stable ? Une action pour ouvrir ou fermer, et la suivante avec une décision basée sur le nombre de positions sur le marché ou dans l'historique.
 
Ihor Herasko:

Faites-vous référence à ces deux entrées ?

Non, le dernier enregistrement de l'activité commerciale se trouve dans le deuxième journal.

 
fxsaber:

Il est également important d'imprimer OrdersTotal.

J'ai ajouté des empreintes. Il reste maintenant deux postes, comme prévu :

#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());
}

Résultat :

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:

Quelle est la solution ?

nombre de positions sur le marché ou dans l'historique.

Il n'y a eu aucune difficulté, je l'ai écrit à la volée.

 

Il ouvre des positions comme celle-ci sans s'arrêter du tout

#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); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

Photo par

 
SanAlex:

Il ouvre des positions comme celle-ci sans s'arrêter du tout

Eh bien, qui va mettre à jour le total ? ))

Raison: