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

 
Igor Makanu:

dans le PM a abandonné le serveur

Ce serveur (ou plutôt le logiciel du courtier) dispose d'une protection anti-spam. Ils prévoient de le mettre à jour d'ici la semaine prochaine et le ralentissement disparaîtra.

 
fxsaber:

Je vais devoir jeter un coup d'oeil à ce serveur. Il serait bon de vérifier la béquille proposée ici, pour qui cela semble important.

Je ne voudrais pas revenir sur ce sujet après un certain temps. Il serait préférable de signaler les bogues, s'il y en a.

Il n'y a pas encore d'option dans le style MT4 ?

Il suffit d'exécuter le script en ouvrant 100 positions sur différents serveurs ?

 
Andrey Khatimlianskii:

Pas encore d'option dans le style MT4 ?

Il n'a pas encore commencé. Le plus souvent, l'utilisateur ne modifiera rien dans le code. La fonctionnalité supplémentaire sera activée par une macro.

Il suffit d'exécuter le script en ouvrant 100 positions sur différents serveurs ?

Oui, sur des serveurs différents, mais seulement un script différent. Si aucun doublement ne se produit pendant une minute d'exécution, il a passé le contrôle avec succès. Sinon - échec.

Библиотеки: TradesID
Библиотеки: TradesID
  • 2021.03.29
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TradesID
 
fxsaber:

Il n'a pas encore commencé. Le plus souvent, l'utilisateur ne modifiera rien dans le code. La fonctionnalité supplémentaire sera activée par une macro.

Je l'ai.

Библиотеки: MT4Orders
Библиотеки: MT4Orders
  • 2021.02.09
  • www.mql5.com
MT4Orders: Автор: fxsaber...
 

C'était.

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

La grande et la terrible MT4 pour toujours (ou comment construire une stratégie de migration intelligente)

fxsaber, 2021.05.11 09:05

Sans attendre une position - des résultats immédiats.

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}

C'est le cas.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Maintenant, pas de différence avec la variante MT4, y compris la fiabilité.

Tous les exemples qui sont si difficiles à écrire dans MT5 sont devenus facilement implémentables, comme ils devraient l'être.

 

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

La grande et la terrible MT4 pour toujours (ou comment construire votre stratégie de migration)

Igor Makanu, 2021.05.10 10:28

cela semble fonctionner :

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 10)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 10) return;
   }
}

mais très lente, et la solution est médiocre.

Que se passera-t-il si, après le placement de l'ordre d'ouverture de la 10ème position, à la prochaine itération, si le

while(PositionsTotal() < 10)

PositionTotal n'a pas eu le temps de se mettre à jour (=9), et l'ordre a déjà réussi à entrer dans l'historique et OrdersTotal()==0.

Dans ce cas, y aura-t-il un autre Trade.Buy() ?

Théoriquement, cela peut se produire plusieurs fois de suite ?

Ou ai-je manqué quelque chose ?

 
mktr8591:

Que se passe-t-il si, après que l'ordre d'ouverture de la 10ème position a été placé, à la prochaine itération de l'ordre d'ouverture de la 10ème position ?

PositionTotal n'a pas eu le temps de se mettre à jour (=9), et l'ordre a déjà réussi à aller dans l'historique et OrdersTotal()==0.

Dans ce cas, y aura-t-il un autre Trade.Buy() ?

Théoriquement, cela peut se produire plusieurs fois de suite ?

Ou est-ce que je rate quelque chose ?

c'est son intérêt pour la haute fréquence, les autres ont assez de temps morts et n'ont pas de problème avec un deuxième essai

Je suis sûr que c'est comme ça que c'est construit dans MT4, attendez et observez.
 
mktr8591:

Que se passe-t-il si, après que l'ordre d'ouverture de la 10ème position a été placé, à la prochaine itération de l'ordre d'ouverture de la 10ème position ?

PositionTotal n'a pas eu le temps de se mettre à jour (=9), et l'ordre a déjà réussi à aller dans l'historique et OrdersTotal()==0.

Dans ce cas, y aura-t-il un autre Trade.Buy() ?

Bien sûr, ça le sera. Le raisonnement dans le code est exactement le même.

Théoriquement, il peut répéter plusieurs itérations successives ?

Si Buy est vrai, alors il y a une probabilité quasi nulle que l'itération suivante ait OrdersTotal() == 0. C'est-à-dire que l'ouverture de 12 postes est impossible en pratique.


C'est un cas très primitif. Une double entrée ressemble souvent à ceci :

  1. Limit OrdersTotal = 1, PositionsTotal = 0.
  2. Les limiteurs sont exécutés. CommandesTotal = 0, PositionsTotal = 0.
  3. Les postes sont ouverts. CommandesTotal = 0, PositionsTotal = 1.

Lors de la deuxième étape, le conseiller expert voit qu'il n'y a rien et fixe une limite. En conséquence, nous avons deux postes ouverts.

Le deuxième point concerne le dépassement du MT5. Et maintenant la béquille la contourne.

 

Merci.

A propos de ça :

fxsaber:

Le doublement n'est pas une difficulté de MT5, mais un bug architectural, lorsque les fonctions Total() montrent des faux positifs.

Vous pouvez dire que c'est un bogue, ou vous pouvez le présenter différemment :-)

PositionsTotal() n'est pas le nombre de positions ouvertes, mais la taille du tableau des positions ouvertes. Le tableau des positions - est en fait un cache, comme le cache de l'historique des transactions, seulement il est mis à jour non pas sur demande, mais automatiquement, mais pas instantanément, et avec un léger retard. Pour cette raison, il ne peut pas contenir de positions déjà ouvertes, ou contenir des positions déjà fermées.

La même chose avec OrdersTotal().

Si nous expliquons l'aide de cette manière, il y aura moins de questions, de plaintes et de malentendus.

Et dans l'article "Ordres, positions et transactions dans MetaTrader 5", vous pouvez prêter attention à ceci (maintenant c'est ambigu - "Le résultat de la fonction PositionsTotal() ne dépend pas du fait que le cache des positions soit plein ou non - il renvoie toujours le nombre réel de positions ouvertes dans le terminal de base pour tous les symboles").


P.S. Mais une question légitime se pose alors : pourquoi ne pas créer une fonction/un drapeau système pour déterminer l'état de synchronisation des tableaux des ordres en direct, des positions, des transactions et des ordres exécutés, afin de ne pas créer de béquilles ?
 
mktr8591:

P.S. Mais alors une question légitime se pose : pourquoi ne pas faire un système fi/flag pour déterminer l'état de synchronisation des tableaux des ordres en direct, des positions, des transactions et des ordres exécutés, afin de ne pas créer de béquilles ?

Il est fort probable que ce drapeau n'existe pas à l'intérieur.