MT5 et la vitesse en action - page 30

 
Renat Fatkhullin:

un objet de base de données de symboles synchronisés. Les locos de lecture/écriture sont mélangées, car il y a un tic d'écriture constant.

Existe-t-il un seul objet de la base de données des symboles pour tous les symboles à la fois ? Si c'est le cas, il s'avère que la demande d'un tick pour EURUSD ralentit potentiellement la demande d'un tick pour GBPUSD.


Pouvez-vous lui préparer un MqlTick au moment où OnTick est appelé, afin qu'il ne soit pas demandé à la base de données de manière générale ?

 
fxsaber:

Pouvez-vous préparer un MqlTick pour OnTick, afin qu'il ne soit pas appelé depuis la base de données de manière générale ?

Ce serait bien, alors peut-être que MQL5 aura des variables prédéfinies comme dans 4 - Ask et Bid.

 

Il est fort probable que le ralentissement soit dû à une consommation élevée du CPU du côté de MT5 lorsque de nombreux EAs sont en cours d'exécution. Je ne sais pas comment cela se passe avec MT4. Sinon, il est difficile d'expliquer pourquoi des décalages apparaissent dans un terminal vide fonctionnant en parallèle.

Il est certain que la réduction de l'utilisation de l'API de l'environnement de négociation résoudra le problème. Après la danse du tambourin, je vous communiquerai les résultats.

 
fxsaber:

Vous vous trompez. Chaque EA est purement commercial (dans le Tester par des ticks réels non ralentis) et ne dépend pas des autres. Toute la logique de négociation est exécutée uniquement en OnTick, pas de spamming d'ordres de négociation, pas de récursion, pas de globalisation et pas de ressources.

OnTrade*, OnBook ne sont pas utilisés. Second timer et OnChartEvent pour le cas où certaines touches sont pressées.


Je suis sûr qu'une implémentation correcte (par vous ou par moi) des instantanés réduira considérablement le nombre d'appels aux fonctions régulières de l'environnement. Par conséquent, les retards seront considérablement réduits.

Je n'ai jamais pensé que ça arriverait. J'étudie la question, car l'implémentation standard de l'EA MT5 est malheureusement boiteuse.

Je ne peux pas du tout croire votre affaire.

Nous avons montré nos calculs
 
Renat Fatkhullin:
Je ne crois pas du tout à votre affaire.

Via TeamViewer ou similaire, prêt à faire une démonstration.

 
::TerminalInfoInteger(TERMINAL_BUILD) = 2605
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
(bool)::TerminalInfoInteger(TERMINAL_VPS) = false
::HistoryDealsTotal() = 13973
::HistoryOrdersTotal() = 18606
::TerminalInfoInteger(TERMINAL_MAXBARS) = 5000
::TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1464
::MQLInfoInteger(MQL_MEMORY_USED) = 5
::ObjectsTotal(0) = 462
ChartsTotal = 16
::SymbolsTotal(true) = 19 (16 + 3)

Veuillez indiquer comment réduire la consommation de mémoire du terminal. J'utilise des ticks frais de CopyTicks pour 16 caractères. Il semble que chaque CopyTicks garde en mémoire 128K ticks. Je n'en ai pas du tout besoin, mais je les garde en mémoire. Pourquoi faut-il presque 1,5 Go ? Les développeurs peuvent-ils voir quelle partie de la mémoire est utilisée pour quoi ? Un gestionnaire de tâches rudimentaire.

 
fxsaber:

Il est fort probable que le ralentissement soit dû à une consommation élevée du CPU du côté de MT5 lorsque de nombreux EAs sont en cours d'exécution. Je ne sais pas comment cela se passe avec MT4. Sinon, il est difficile d'expliquer pourquoi des décalages apparaissent dans un terminal vide fonctionnant en parallèle.

Il est certain que la réduction de l'utilisation de l'API de l'environnement de négociation résoudra le problème. Je vais écrire sur les résultats après avoir dansé avec des tambourins.

C'est exactement ce dont je parlais il y a quelques pages. De plus, les EA peuvent être très simples et basés sur des symboles non liquides, c'est-à-dire que l'important n'est pas le nombre d'opérations mathématiques effectuées dans le code de chacun des EA. Le problème réside dans le terminal lui-même et nous ne pourrons pas le résoudre en améliorant notre code. Malheureusement :(

P.S J'ai réécrit la logique utilisée dans la moitié de mes EAs de OnBook vers OnTick et remplacé le Core i5 par du Xeon E5-2678. Il semblerait que la vitesse devrait augmenter, mais hélas, un miracle ne s'est pas produit :(

 
HistorySelect est en retard sur les fonctions OnTrade.
// Демонстрация лага HistorySelect в OnTrade*-функциях.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, inAlertTime)

const bool Init = EventSetTimer(1);

void OnTimer()
{
  static MqlTradeRequest Request = {0};
  static MqlTradeResult Result = {0};

  if (PositionSelectByTicket(Result.order)) // Если позиция открыта - закрываем.
  {
    Request.type = ORDER_TYPE_SELL;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    Request.position = Result.order;
  }
  else // Иначе - открываем.
  {
    Request.action = TRADE_ACTION_DEAL;
    Request.type = ORDER_TYPE_BUY;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    Request.position = 0;
  }

  const bool AntiWarning = OrderSendAsync(Request, Result); // Асинхронный приказ не случайно
}

void OnTrade()
{
  _B2(HistorySelect(0, INT_MAX));  
}


A presque toutes les étapes.

2020.09.23 11:59:46.351 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:46.354 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:48.294 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:48.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:49.283 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:49.285 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:50.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:50.302 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.
2020.09.23 11:59:51.275 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:51.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:52.267 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:52.269 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:54.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:54.282 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.


Espérons que les constructions de cache ne prennent pas autant de temps, et que ce décalage est dû à l'accès à la base de données pendant la mise à jour de celle-ci.

 

Savez-vous pourquoi mt5 ne dispose pas de l'onglet "Commissions" ? Ils n'apparaissent qu'après la clôture d'une transaction.

Savez-vous pourquoi mt5 ne dispose pas de l'onglet 'Commissions' ? Ils n'apparaissent qu'après la clôture d'une transaction.

 

Si vous exécutez cet EA sur un compte sans positions ou ordres actuels.

// Создает маркет-ордер в случае, если нет текущих позиций и ордеров.
bool PositionOpen()
{
  bool Res = (!PositionsTotal() && !OrdersTotal());
  
  if (Res)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;
    
    Request.action = TRADE_ACTION_DEAL;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    
    Res = OrderSendAsync(Request, Result);    
  }
  
  return(Res);
}

void OnInit()
{
  PositionOpen();
}

void OnTrade()
{
  PositionOpen();
}

puis fermez manuellement la position ouverte par l'EA, il y aura alors trois positions ouvertes sur le hedge (sur la compensation de la position triple volume).


Est-ce le bon comportement ? Je n'ai probablement pas bien compris le terminal. Alors, veuillez expliquer.

Raison: