Bibliothèque de classes génériques - bogues, description, questions, caractéristiques d'utilisation et suggestions - page 16

 
fxsaber:

Intéressant. Et voici une question. Je n'aimais pas la mise en œuvre actuelle et je l'ai modifiée. C'est tordu, bien sûr. Comment puis-je obtenir la bible originale ?

Ici - de 1702

Dossiers :
Generic.zip  44 kb
 
Artyom Trishkin:

Ici - de 1702

Merci ! Je vais poser la question aux développeurs. Comme je suis un peu un lisseur...

 

Exemple 2 : Trading de plusieurs EA sur un compte net

Le positionnement net est un casse-tête, pour ceux qui négocient plus d'un conseiller expert sur le même symbole en même temps. Pour traiter les situations où les deux EA sont dans une couverture, mais doivent comprendre que l'absence de position nette n'indique pas vraiment qu'ils ne sont pas sur le marché, génère un code complexe. Une solution consiste à calculer la contribution de chaque expert à la position totale. Pour ce faire, nous devons analyser l'ensemble de l'historique et calculer quel nombre de contrats appartient à chaque Medgie unique. Si le chiffre est 0.0, l'expert est hors du marché, s'il est négatif, l'expert est court, s'il est positif, il est long. En fait, c'est très simple, si nous utilisons CHashMap et que nous décomposons toutes les transactions par ordres magiques en additionnant leurs volumes. J'ai esquissé un code très simple (prototype) ci-dessous :

//+------------------------------------------------------------------+
//|                                                 NettoByMagic.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Generic\HashMapGen.mqh>

CHashMap<ulong, double> PositionsByMagic;
int prev_deals = 0;
//+------------------------------------------------------------------+
//| Добавляет новый объем и его меджик                               |
//+------------------------------------------------------------------+
void AddVolume(ulong magic, double volume)
{
   double cur_volume = 0.0;
   if(PositionsByMagic.TryGetValue(magic, cur_volume))
      PositionsByMagic.TrySetValue(magic, cur_volume+volume);
   else
      PositionsByMagic.Add(magic, volume);
}
//+------------------------------------------------------------------+
//| Добавляет новые сделки в словарь                                 |
//+------------------------------------------------------------------+
void ParseDeals()
{
   HistorySelect(0, TimeCurrent());
   for(int i = prev_deals; i < HistoryDealsTotal(); i++)
   {
      ulong ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetString(ticket, DEAL_SYMBOL)!= Symbol())
         continue;
      ENUM_DEAL_TYPE deal_type = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
      double volume = 0.0;
      if(deal_type == DEAL_TYPE_BUY)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
      else if(deal_type == DEAL_TYPE_SELL)
         volume = HistoryDealGetDouble(ticket, DEAL_VOLUME)*(-1);
      else
         continue;
      ulong magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      AddVolume(magic, volume);
   }
   prev_deals = HistoryDealsTotal();
}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   ParseDeals();
   for(int i = 0, k = 0; i < PositionsByMagic.Count(); i++)
   {
      ulong magic = PositionsByMagic.GetKeyAt(i);
      double valume = PositionsByMagic.GetValueAt(i);
      if(k == 10)
         break;
   }
}
//+------------------------------------------------------------------+

Attention ! Pour simplifier, le code ne calcule que le volume net pour le symbole actuel. De plus, CHashMap dans son implémentation actuelle ne contient pas d'itérateurs d'énumération, j'ai donc créé à la hâte de tels itérateurs. La carte CHashMap modifiée est présentée dans la pièce jointe.

Dossiers :
HashMapGen.mqh  25 kb
 
fxsaber:

La vitesse du testeur est-elle importante pour le trading ? Si c'est le cas, le HashMap a également une incidence sur le commerce, car il augmente la vitesse de développement et d'exécution du TS.

Tester, optimiser et négocier sont des choses différentes.

Mais un exemple concret d'une tâche où il est nécessaire d'utiliser ces algorithmes efficaces pour le stockage et l'extraction de données, au moins pour l'optimiseur, car pour le commerce, quelqu'un peut-il donner un exemple ?

 
Alexey Oreshkin:

Si je voulais faire du trading avec des systèmes de trading automatisés, je ne pourrais pas donner d'exemples de tâches pour lesquelles ces algorithmes efficaces de stockage et de récupération des données sont nécessaires, du moins pour l'optimiseur, car il n'existe pas de tels algorithmes pour le trading ?

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

Bibliothèque de classes génériques - bogues, description, problèmes, cas d'utilisation et suggestions

fxsaber, 2017.12.08 22:46

Pour un cas de test plus réaliste (2000 transactions et 1 000 000 d'accès à l'historique unique), le résultat ressemble à ceci

2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitFull))] = 122969
2017.12.05 00:00:00   Time[SetHashMap()] = 816
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitHashClear))] = 23852
2017.12.05 00:00:00   Time[HistorySelect(0,INT_MAX)] = 1
2017.12.05 00:00:00   4829800340.792288
2017.12.05 00:00:00   Time[Print(SumProfit(Deals,GetDealProfitClear))] = 114427

Près de 100 ms d'économie par passage ! Si, par exemple, nous optimisons pour 10 000 passages complets, la variante Hash sera plus rapide de 15 minutes.

 
Vasiliy Sokolov:

Exemple 2 : Trading de plusieurs EA sur un compte net

J'ai oublié
prev_deals = HistoryDealsTotal();


Un bon exemple ! Très pratique.

 
fxsaber:
J'ai oublié

Bon exemple ! Pratique, en effet.

Corrigé.

 

Il y a des vélos qu'il est plus facile de construire soi-même que de régler les nuances de l'utilisation de celui de quelqu'un d'autre et de dépendre de lui.

Le générique n'est pas ce genre de vélo. Vous ne pouvez pas l'écrire rapidement et correctement. Il s'agirait juste de le compléter.

 
fxsaber:

Excellent exemple théorique ! Dans la pratique, quelqu'un a-t-il déjà effectué des milliers de transactions ?

p.s. Je n'essaie pas de prouver que c'est de la merde et que personne n'en a besoin. J'essaie de comprendre la valeur pour le commerce réel. Je ne suis pas du tout un théoricien, mais un pur praticien.

 
Alexey Oreshkin:

En pratique, quelqu'un a-t-il déjà effectué des milliers de transactions ?

Sur les Forts tous les premiers.