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

 

cela fonctionne bien - (en fonction de quel objectif !?)

#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!=0)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+
 
SanAlex:

qui fonctionne bien - (en fonction de quel objectif !?)

Ne vous impliquez pas. Ils ont un DC spécial qui construit toutes sortes d'intrigues pour attraper les MT bugs.

 
Alexey Viktorov:

Un DC spécial qui construit toutes sortes d'intrigues pour attraper les MT bugs.

La plupart des courtiers travaillent selon le même schéma : Result.deal == 0.

Par exemple, Signals est le courtier le plus populaire pour le scalping.

Parmi les courtiers réputés, il est assez difficile de trouver un MT5 qui fonctionne selon un schéma différent.

 
SanAlex:

cela fonctionne bien - (selon le but recherché !?)


Qu'est-ce qui "fonctionne bien" exactement ?
Vous avez une erreur dans votre code, qui a déjà été signalée ci-dessus.
 
fxsaber:

La plupart des courtiers travaillent selon le même schéma : Result.deal == 0.

Signals, par exemple, est le courtier le plus populaire pour le scalping.

Parmi les courtiers connus, il est assez difficile de trouver un MT5 qui fonctionne selon un schéma différent.

Je ne sais pas quel type de scalping fonctionne à tel point que vous n'avez pas le temps de fermer une position...

Si cela ne vous dérange pas, essayez quand même d'ajouter la vérification du nombre de positions

    else if(!PositionsTotal() && !OrdersTotal())

Je pense que les deux positions sont ouvertes et fermées. Cela ne ferait pas de mal d'essayer d'obtenir les types de ces deux positions. S'ils sont dirigés différemment, cela confirmera mes soupçons...

 
Ihor Herasko:

C'est fait :

Résultat :

Obtenez le statut de cette commande. Si le ticket est connu.

La transaction a échoué, le prix d'exécution est de 0.

Structure du résultat de la demande de transaction (MqlTradeResult)

En réponse à une demande de transaction, le serveur de transaction renvoie des données contenant le résultat du traitement de la demande de transaction sous la forme d'une structure prédéfinie spéciale MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Код результата операции
   ulong    deal;             // Тикет сделки, если она совершена
   ulong    order;            // Тикет ордера, если он выставлен
   double   volume;           // Объем сделки, подтверждённый брокером
   double   price;            // Цена в сделке, подтверждённая брокером
   double   bid;              // Текущая рыночная цена предложения (цены реквота)
   double   ask;              // Текущая рыночная цена спроса (цены реквота)
   string   comment;          // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)
   uint     request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
   uint     retcode_external; // Код ответа внешней торговой системы
  };

 
Rashid Umarov:

Donc obtenir le statut de cette commande. Si le ticket est connu.

La transaction a échoué, le prix d'exécution est de 0.

C'est ça le problème : c'est passé. Lorsque le script se termine, une ou deux positions sont laissées en suspens (en fonction du nombre d'imprimantes que vous insérez dans le code).

Code :

#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());
      if (OrderSelect(Trade.ResultOrder()))
         PRINT(OrderGetInteger(ORDER_STATE));
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Résultat :

2021.05.05 14:25:14.738 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultDeal() = 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultOrder() = 2249888681
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
2021.05.05 14:25:14.821 Test (EURUSD,M1)        EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE))) = ORDER_STATE_PLACED
2021.05.05 14:25:14.821 Test (EURUSD,M1)        После открытия. PositionsTotal: 1, OrdersTotal: 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Alexey Viktorov:

Je ne sais pas quel genre de scalping fonctionne si fort que vous ne pouvez pas fermer une position à temps...

Tout est dans le temps là-bas. Il s'agit simplement d'une caractéristique architecturale de MT5.

Si vous le voulez bien, essayez d'ajouter la vérification du nombre de positions

Cette vérification est présente dans le code source.

Je pense que les deux positions sont ouvertes et fermées. Cela ne ferait pas de mal d'essayer d'obtenir les types de ces deux postes. S'ils sont dirigés différemment, cela confirmerait mes soupçons...

Il n'existe pas de position de fermeture.

 
fxsaber:

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

Ça n'a pas marché, j'ai trouvé des problèmes.

 
fxsaber:

Ça n'a pas marché, j'ai trouvé des problèmes.

J'ai hâte d'y être. Si vous avez besoin d'aide pour quoi que ce soit, écrivez-nous.

Raison: