MT5 et la vitesse en action - page 18

 
Renat Fatkhullin:

Vous n'avez que deux états : 5000 et unlim ?

Vous êtes le maître de votre propre bonheur.

Oui, il faut soit un contrôle total, soit un contrôle superficiel. Je ne vois pas l'intérêt de l'entre-deux.
 
Renat Fatkhullin:

En théorie, oui.

N'oubliez pas les processus de synchronisation. Un grand nombre de processus de la plate-forme sont asynchrones.

Par exemple, une intégration de passerelle avec une bourse ou un fournisseur de liquidités peut envoyer des rapports de transaction avec des délais de quelques secondes, voire de quelques minutes. Souvent, l'API ne donne pas du tout accès à l'historique pour la réconciliation, mais fournit des générateurs de rapports lents et non rythmés.

À l'ouverture du marché, ou en raison d'une reconnexion inattendue de la passerelle, les rapports peuvent être retardés. Ils sont répliqués dans l'historique sur le serveur et envoyés immédiatement de manière asynchrone aux terminaux. Grâce au tri par date, ils sont insérés aux bons endroits, et entre-temps vous pouvez ouvrir de nouvelles transactions.

La plupart des API d'intégration sont si illisibles et dysfonctionnelles qu'elles rendent presque impossible la création de passerelles garanties. Bien que certains pensent que c'est le résultat d'un sabotage délibéré de la part de leurs développeurs.

Faut-il donner le droit de choisir ? Qui a besoin de snaps physiques et qui en a assez pour travailler avec des index avec des risques appropriés.

 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL5 MT5 MetaTrader 5".
 
fxsaber:

Faut-il donner le droit de choisir ? Qui a besoin de snaps physiques et qui en a assez pour travailler avec des indices avec les risques appropriés.

Quel est le problème de garder un cache local sur l'EA et d'échantillonner par rapport à l'heure de la dernière mise à jour ? J'en ai un et je n'ai jamais eu de problèmes avec lui. Mes fonctions réseau ralentissent l'ensemble de l'interface à cause de son implémentation synchrone, ce serait bien d'avoir WebRequestAsync dès le départ, bien que je cherche déjà des DLL ou même des wrappers python et C++, car il y a une API de négociation en python :)

Mais travailler avec de grandes quantités de données sans mise en cache locale est très étrange.

PS. En général, les masques de hachage et la mise en cache sont très demandés en multidevises et c'est pourquoi j'ai demandé plus haut dans ce fil de discussion des masques de hachage normaux (lire rapides) prêts à l'emploi.
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev:

Quel est le problème de garder un cache local sur l'EA et d'échantillonner par rapport à l'heure de la dernière mise à jour?

C'est ce que faitle scénario.

Quant au cache local, c'est ainsi que l'historique est implémenté dans MT4Orders.

 
fxsaber:

Quant au cache local, c'est ainsi que MT4Orders a mis en œuvre l'histoire.

Je ne m'attendais pas à ce que le scénario, qui date de deux ans, soit

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

Conseiller expert OrderCloseTime MQL5

fxsaber, 2018.07.06 00:49

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


montrera de tels freins !

// Первый запуск
2020.08.28 22:01:12.941 HistoryDealsTotal() = 9435
2020.08.28 22:01:13.198 2046.04.30 00:13:20
2020.08.28 22:01:13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08.28 22:01:43.982 2046.04.30 00:13:20
2020.08.28 22:01:43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08.28 22:03:31.474 HistoryDealsTotal() = 9435
2020.08.28 22:03:31.724 2046.04.30 00:13:20
2020.08.28 22:03:31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08.28 22:04:02.011 2046.04.30 00:13:20
2020.08.28 22:04:02.011 Time[Bench(LastTimeMQL5)] = 30286258

MQL5 pur est 100 fois plus lent que la mise en cache partielle (uniquement HistorySelectByPosition).

 
Le test est tout à fait inacceptable.

Pour le style MQL5, vous avez spécifiquement testé 10 000 échantillons de HistorySelect sur l'ensemble de la profondeur. Et vous avez également ajouté des cycles supplémentaires.

Sans une déclaration initiale claire des conditions, expliquant leur partialité évidente et donnant des chiffres choquants - c'est la tricherie et la manipulation la plus pure.

Pour un tel jeu déloyal avec un ticket d'aconit.
 
Renat Fatkhullin:
Le test est tout à fait inacceptable.

Pour le style MQL5, vous avez spécifiquement testé 10 000 échantillons de HistorySelect sur l'ensemble de la profondeur. Et vous avez également ajouté des cycles supplémentaires.

Sans une déclaration initiale claire des conditions, expliquant leur partialité évidente et donnant des chiffres choquants - c'est la tricherie et la manipulation la plus pure.

Pour un tel jeu déloyal avec un ticket d'aconit.

Eh bien, votre perception est fausse. Il est démontré qu'il est correct de se cacher afin de ne pas avoir d'épine dans le pied.

Si je comprends bien, après cette mise en œuvre.

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

MT5 et la vitesse en action

Renat Fatkhullin, 2020.08.27 22:58

Nous avons déjà optimisé un grand nombre d'opérations d'échantillonnage et nous pensons maintenant à la mise à jour optimale du cache, alors qu'en réalité 99% des échantillons seront complètement inutiles et seront manqués en fait.

En d'autres termes, à moins que vous ne rendiez les limites d'échantillonnage spécifiquement aléatoires, le cache affichera des occurrences proches de 100 %.

La semaine prochaine, il y aura probablement déjà une solution efficace.


cet exemple s'exécutera beaucoup plus rapidement.


HH Le script calcule l'heure d'ouverture/de fermeture de la dernière position dans l'historique des transactions.

 
fxsaber:

Il vous montre comment vous cacher correctement, afin de ne pas être déstabilisé.

Si vous "cachez" comme ça, ce sera super rapide.

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // Хранит тикет входа позиции с последнего вызова.
  static ulong PrevTicketOut = 0; // Хранит тикет выхода позиции с последнего вызова.
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

Qui écrit comme ça ?

 
fxsaber:

Si vous le mettez en cache comme ça, c'est super rapide.

Qui écrit comme ça ?

Les programmeurs C.