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

 
Andrey Khatimlianskii:

Tu ne peux pas parler avec ta langue. Tu devrais m'apprendre. Moi, s'il vous plaît.

Il y a un problème, et ce n'est pas seulement chez ce courtier.
Et le problème ne réside pas dans l'attente de l'exécution d'un ordre spécifique (c'est une autre affaire), mais dans le fait qu'au moment de l'exécution de l'ordre, ils disparaissent temporairement de toutes les listes (ouvertes, fermées, transactions, positions).

Nous pourrions utiliser une autre béquille, bien sûr. Mais nous voulons trouver une solution humaine. Et donc fxsaber travaille dessus en public, en écoutant les aboiements des sympathisants qui passent par là.

Personnellement, j'espère que vous pouvez comprendre la documentation

Pendant que le conseiller expert traite les transactions commerciales à l'aide du gestionnaire OnTradeTransaction(), le terminal continue de traiter les transactions commerciales nouvellement arrivées. Par conséquent, l'état d'un compte commercial peut déjà changer pendant l'exécution de OnTradeTransaction(). Par exemple, pendant qu'un programme MQL5 traite un événement d'ajout d'un nouvel ordre, celui-ci peut être exécuté, supprimé de la liste des ordres ouverts et déplacé vers l'historique. Par la suite, le programme sera informé de tous ces événements.
et cela s'applique non seulement au gestionnaire d'événements OnTradeTransaction(), mais aussi à toute partie du code après l'envoi de OrderSend(). Attendez l'achèvement de la transaction. Il n'y a pas d'autres options et il n'y en aura pas. Pensez simplement pourquoi tout est si simple dans mql4 ? Eh bien, c'est parce que ces attentes sont formulées loin de vos yeux. Et dans MQL5, vous pensez en quelque sorte que tous les contrôles et les attentes sont des béquilles. Pourquoi ?
 
Alexey Viktorov:

Personnellement, j'espère que vous avez suffisamment de recul pour comprendre de tels mots de documentation...

Et cela ne concerne pas seulement le gestionnaire d'événements OnTradeTransaction(), mais aussi toute partie du code après l'envoi de OrderSend(). Attendez l'achèvement de la transaction. Il n'y a pas d'autres options et il n'y en aura pas. Pensez simplement pourquoi tout est si simple dans mql4 ? Eh bien, c'est parce que ces attentes sont formulées loin de vos yeux. Et dans MQL5, vous pensez en quelque sorte que tous les contrôles et les attentes sont des béquilles. Pourquoi ?

Alexey, vous êtes hors sujet. Désolé, je n'ai ni le temps ni l'envie de tout expliquer à nouveau.

 

J'ai essayé de cette façon :

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

J'ai exécuté mon code 5 fois, jusqu'à ce qu'exactement 10 positions soient ouvertes.

 
Igor Makanu:

J'ai essayé de cette façon :

Exécuter mon code 5 fois, jusqu'à ce qu'exactement 10 positions soient ouvertes.

Il semble qu'une erreur se soit produite lors de la définition des entrées HistorySelect.

 
fxsaber:

Il semble qu'une erreur se soit produite lors de la définition des entrées HistorySelect.

idée pour atteindre le serveur et se synchroniser

l'a réécrit comme un script :

//+------------------------------------------------------------------+
void OnStart()
{
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) return;
   }
}
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
{
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
//+------------------------------------------------------------------+

l'a exécuté plusieurs fois, ouvre également 10 positions, a ajouté l'heure de début actuelle du script

 
Igor Makanu:

l'idée d'atteindre le serveur et de se synchroniser

l'a réécrit comme un script :

Je l'ai exécuté plusieurs fois, j'ai également ouvert 10 positions, j'ai ajouté l'heure de début du script.

Que montrera ce changement ?

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

Que montrera ce changement ?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh : TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh est activé.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alerte : Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart : HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

les positions sont toujours de 10 %, pas encore de doublement
 
Igor Makanu:

Les positions sont toujours de 10 pcs, pas encore de doublement.

Vous pouvez clairement voir par le temps d'exécution de HistorySelect qu'il ne demande rien au serveur de commerce.


Plusieurs versions.

  1. Vous avez de la chance.
  2. Cette branche a provoqué un changement discret dans la nouvelle construction du terminal. Ce qui est facile à confirmer s'il y a un retour de bâton dans les anciens.
  3. Comportement inhabituel de HistorySelect lorsque From >= To.
  4. Serveur de commerce. Nom ?


Essayez de la même manière de vous débarrasser du doublement ici.

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

Le grand et puissant MT4 Forever (ou comment élaborer une stratégie correcte pour passer à la vitesse supérieure)

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

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

Exécutez ce code sur un compte de démonstration vide et voyez si deux positions s'ouvrent en quelques secondes.

 

Je suis venu par hasard et je l'ai lu - c'est une honte !

Il ne faut faire confiance à personne !
 
fxsaber:

Vous pouvez clairement voir dans le temps d'exécution de HistorySelect qu'il ne demande rien au serveur de commerce.


Plusieurs versions.

  1. Vous avez de la chance.
  2. Cette branche a provoqué un changement discret dans la nouvelle construction du terminal. Ce qui est facile à confirmer s'il y a un retour de bâton dans les anciens.
  3. Comportement inhabituel de HistorySelect lorsque From >= To.
  4. Serveur de commerce. Nom ?


Essayez de la même manière de vous débarrasser du doublement ici.

1. hélas, nous ne pouvons pas survivre dans notre métier sans elle ;)

2. j'ai demandé il y a quelques jours quelle build (pas bêta) est pertinente, silence, j'ai décidé de ne pas mettre à jour, sur un ordinateur portable et sur un PC il est difficile de comprendre quelles builds sont pertinentes - je n'ai pas travaillé avec les terminaux pendant quelques mois, je ne suis pas. Maintenant sur le PC build 2903.

3. je passe, vous êtes en charge de ce banquet, les développeurs sont silencieux, à mon avis... pouce dans le ciel, je pense que le problème est dans la latence du réseau, et les multiples sockets ? terminal, pas de synchronisation, un socket prix, un autre OrderSend, un autre où OnTrade()..... donc les paquets volent d'où et où

4. j'ai robotforex + 100 mbps optique (ETTH), j'avais un mauvais internet mobile et fhopin sur mon ordinateur portable avant


J'ai essayé pendant 2 minutes, le script a vacillé pendant 2 minutes, toujours une position, pas d'inversion, j'ai retiré le script à la main.