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

 
fxsaber:

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

Et c'est correct en termes de priorité :

2021.05.05 10:32:35.896 Trades  '160122203': market buy 0.01 EURUSD placed for execution
2021.05.05 10:32:35.931 Trades  '160122203': order #2249869869 buy 0.01 / 0.01 EURUSD at market done in 81.962 ms
2021.05.05 10:32:35.931 Trades  '160122203': deal #2240398230 buy 0.01 EURUSD at 1.19876 done (based on order #2249869869)
2021.05.05 10:32:35.931 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': accepted market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876 placed for execution
2021.05.05 10:32:36.009 Trades  '160122203': order #2249869870 sell 0.01 / 0.01 EURUSD at market done in 77.026 ms
2021.05.05 10:32:36.009 Trades  '160122203': deal #2240398231 sell 0.01 EURUSD at 1.19876 done (based on order #2249869870)
2021.05.05 10:32:36.009 Scripts script Test (EURUSD,M1) removed

Ici, je suis revenu à l'option sans impression et, là encore, il reste une position après exécution. Il s'avère que vous devez faire une sorte de pause après l'exécution des transactions. Mec, quelle béquille.

 
Ihor Herasko:

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

mais lorsqu'il y a une position ouverte, le script la ferme et ne fait rien d'autre.

Instantané2

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

De plus, si j'essaie d'ouvrir une position, le script la ferme instantanément.

 
fxsaber:

a réussi à écrire IsSynchronized(). Le code est un peu lourd. Je n'ai pas encore décidé sous quelle forme le poster.

Comment cela fonctionne-t-il ? Il est en quelque sorte trouvé mais en quelque sorte absent ? Quel est l'essentiel ou le principe de la solution ?

 
SanAlex:

Mais lorsqu'il y a une position ouverte, le script la ferme et ne fait rien d'autre.

Tous les serveurs ne reproduisent pas l'ouverture de deux postes. Dans votre cas, il s'agit du troisième côté (un côté - deux positions, l'autre - une position).

 
Ihor Herasko:

Et c'est à peu près correct en termes de séquencement :

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Le grand et puissant MT4 Forever (ou comment choisir la stratégie de migration)

Ihor Herasko, 2021.05.05 09:35

Et tout est là en termes de commande :

2021.05.05 10:32:35.896 Trades  '160122203': market buy 0.01 EURUSD placed for execution
2021.05.05 10:32:35.931 Trades  '160122203': order #2249869869 buy 0.01 / 0.01 EURUSD at market done in 81.962 ms
2021.05.05 10:32:35.931 Trades  '160122203': deal #2240398230 buy 0.01 EURUSD at 1.19876 done (based on order #2249869869)
2021.05.05 10:32:35.931 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': accepted market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876 placed for execution
2021.05.05 10:32:36.009 Trades  '160122203': order #2249869870 sell 0.01 / 0.01 EURUSD at market done in 77.026 ms
2021.05.05 10:32:36.009 Trades  '160122203': deal #2240398231 sell 0.01 EURUSD at 1.19876 done (based on order #2249869870)
2021.05.05 10:32:36.009 Scripts script Test (EURUSD,M1) removed

Les lignes en surbrillance confirment la séquence.

PositionsTotal = 1 - envoie un ordre de clôture.

  • Alors PositionsTotal = 2 et l'ordre de l'étape 1 est fermé.
  • La fermeture a lieu une fois l'exécution du script terminée. Le cache d'impression est un peu déformé.

     
    Dmitry Fedoseev:

    Comment cela ? C'est en quelque sorte trouvé mais en quelque sorte pas là ?

    Je n'ai pas encore eu le temps de le poster. Je le posterai dans les 24 heures.

    Quelle est l'essence ou le principe de la solution ?

    Il analyse la correspondance entre l'historique des transactions et l'environnement commercial actuel. Dans ce cas, il n'y a pas de ralentissement.

    Il vérifie également Result.order.

    Par conséquent, l'utilisation est la suivante : IsSync() renvoie false - l'environnement de négociation dans le Terminal est tordu, sinon nous pouvons procéder comme d'habitude.

     
    Les développeurs de MT sont traditionnellement silencieux. Le shérif ne s'intéresse pas aux problèmes des Indiens.
     
    Ihor Herasko:

    Ajout d'empreintes. Il reste maintenant deux postes, comme prévu :

    Résultat :

    Ajouter Trade.ResultRetcodeDescription()

    
    #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); // Если нет позиции и ордера - открываем позицию.
          Print(Trade.ResultRetcodeDescription());
          printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
        }
        
      Print("Выход. PostionsTotal: ", PositionsTotal());
    }

    Aussi ResultDeal / ResultOrder / ResultComment et Order.État

    Il y aura sûrement une réponse ici

    État
    Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / ResultOrder
    Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / ResultOrder
    • www.mql5.com
    ResultOrder - CTrade - Торговые классы - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
     
    Rashid Umarov:

    Ajouter Trade.ResultRetcodeDescription()

    Et aussi ResultDeal / ResultOrder / ResultComment et Order.État

    Il y aura sûrement une réponse ici

    État

    C'est fait :

    #define  PRINT(A) Print(#A + " = " + (string)(A))
    
    #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); // Если нет позиции и ордера - открываем позицию.
          PRINT(Trade.ResultRetcodeDescription());
          PRINT(Trade.ResultDeal());
          PRINT(Trade.ResultOrder());
          PRINT(Trade.ResultComment());
          printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
        }
        
      Print("Выход. PostionsTotal: ", PositionsTotal());
    }

    Résultat :

    2021.05.05 11:36:14.566 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultDeal() = 0
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultOrder() = 2249874645
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 1
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Выход. PostionsTotal: 2
    
     
    Rashid Umarov:

    Ajouter Trade.ResultRetcodeDescription()

    Et aussi ResultDeal / ResultOrder / ResultComment et Order.État

    Il y aura sûrement une réponse.

    État

    Ce n'est absolument pas le cas, car la condition pour envoyer un ordre au marché afin d'ouvrir une position est PositionsTotal == OrdersTotal == 0.

    Raison: