Algorithmes, méthodes de résolution, comparaison de leurs performances

 

Dans ce fil, nous discuterons des différentes façons de résoudre ces problèmes et nous comparerons les performances des solutions proposées.

Tout le monde est le bienvenu pour discuter des problèmes et des méthodes pour les résoudre ;)

 

Je propose de résoudre un problème :

  1. Écrivez une fonction qui, à chaque appel, acceptera et écrira un nombre pseudo-aléatoire, qui sera un"honeyjack" conditionnel.

2. écrire une deuxième fonction qui appelle la première fonction un nombre pseudo-aléatoire de fois et lui transmet la condition (générée) "medjic".

3. écrire une troisième fonction qui retournera le numéro"medjic" par le numéro"transaction" (un numéro ordinal quelconque) passé par l'utilisateur.


Exigences :

  1. La consommation de mémoire pour l'écriture de "medjic" doit être aussi proche que possible du nombre de "medjic", dont le nombre est inconnu à l'avance.
  2. Les fonctions doivent fonctionner rapidement.

//--------------------------------------------------------

Je pense que la bibliothèque en question dispose des outils nécessaires pour résoudre ce problème.


ZS. Ces trois fonctions simulent le travail avec des commandes EA, dont le nombre n'est pas connu à l'avance. Cette tâche s'inscrit donc dans notre thème.

 
Реter Konow:

Je propose de résoudre un problème :

  1. Écrivez une fonction qui, à chaque appel, acceptera et écrira un nombre pseudo-aléatoire, qui sera un"medjic" conditionnel.

2. écrivez une seconde fonction qui appelle la première fonction un nombre pseudo-aléatoire de fois et lui transmet un "medjic" conditionnel (généré).

3. écrire la troisième fonction, qui renverra le numéro de"medjik" par le numéro de"deal" (tout numéro de série), qui est transféré par l'utilisateur.

Exigences :

  1. La consommation de mémoire pour l'écriture des "medgies" doit être aussi proche que possible du nombre de "medgies", dont le nombre n'est pas connu à l'avance.
  2. Les fonctions doivent fonctionner rapidement.

Je pense que la bibliothèque en question dispose des outils nécessaires pour résoudre ce problème.

SZY. Ces trois fonctions imitent le travail avec les ordres des conseillers experts, dont le nombre n'est pas connu à l'avance. Le problème correspond donc à notre thème.

Peter, je crois que toute fonction doit être utile. Je ne comprends pas très bien ce que les trois fonctions peuvent apporter de bon ?

 
Victor Ziborov:

Peter, je pense que chaque fonction doit être utile. Je ne suis pas sûr de l'effet positif de ces trois fonctions.

Il s'agit d'une ramification de https://www.mql5.com/ru/forum/221917

Nous testons ici l'efficacité des solutions proposées par la bibliothèque dans la pratique.

Dans ce fil de discussion, il a été suggéré que la solution consistant à écrire les ordres medjic dans une chaîne de caractères puis à les placer dans un tableau était inefficace.

La nouvelle bibliothèque générique offre également une solution à ce problème.

Intéressant de confirmer ou d'infirmer l'affirmation selon laquelle l'écriture sur une chaîne est une solution inefficace.

Je pense qu'il sera utile et intéressant de voir ce que la pratique montrera.


Tous ceux qui le souhaitent peuvent essayer de résoudre cette tâche à l'aide de la boîte à outils de la bibliothèque.

Je vais essayer de résoudre cette tâche à ma façon.

Nous comparerons ensuite les performances.

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 

Reg Konow, si vous organisez quelque chose, s'il vous plaît, faites-le à un niveau décent, pas de manière spontanée et de.....stand.

Les termes doivent être clairs, non ambigus et accompagnés d'exemples concrets.....
Voici une liste de questions qui découlent d'une lecture attentive de l'ensemble du premier paragraphe.

  1. Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".

1) Pourquoi mettre en gras le texte qui n'a pas de sens ?
2) La prise d'un pointeur est-elle un "appel" à une fonction ou pas encore ? La fonction est appelée.
3) L'expression "écrire un numéro" est généralement utilisée pour travailler avec des fichiers. S'agit-il d'une inexactitude et se réfère-t-il au travail avec des données en mémoire, ou faut-il encore sauvegarder les données entre les exécutions du programme ?
4) Si vous voulez, un nombre pseudo-aléatoire peut être négatif, mais la magie ne l'est pas. Alors qu'avons-nous : magie ou pseudo-aléatoire dans une certaine fourchette ? Laquelle ?

 
Sergey Dzyublik:

Reg Konow, si vous organisez quelque chose, s'il vous plaît, faites-le à un niveau décent, pas de manière spontanée et de.....stand.

Les termes doivent être clairs, non ambigus et accompagnés d'exemples concrets.....
Voici une liste de questions qui découlent d'une lecture attentive de l'ensemble du premier paragraphe.

1) Pourquoi mettre en gras le texte qui n'a pas de sens ?
2) La prise d'un pointeur est-elle un "appel" à une fonction ou pas encore ? La fonction est appelée.
3) L'expression "écrire un numéro" est généralement utilisée pour travailler avec des fichiers. S'agit-il d'une inexactitude et se réfère-t-il au travail avec des données en mémoire, ou faut-il encore sauvegarder les données entre les exécutions du programme ?
4) Si vous voulez, un nombre pseudo-aléatoire peut être négatif, mais la magie ne l'est pas. Alors qu'avons-nous : magie ou pseudo-aléatoire dans une certaine fourchette ? Laquelle ?

Tâche principale :

Pour mettre en place un accès rapide à un magicien spécifique via un numéro de transaction.

Il est nécessaire d'inscrire les magiciens dans un "dictionnaire" et d'y accéder par le biais du numéro de transaction.

Le nombre de commandes n'est pas connu à l'avance, donc la taille du dictionnaire est inconnue.

Cependant, l'accès doit être rapide et la quantité de mémoire allouée doit être acceptable.

La tâche que je propose vise à imiter le travail d'un EA qui passe des commandes et qui obtient ensuite ses mages par le numéro de métier pour continuer à travailler avec eux.

Vous pouvez résoudre le problème comme bon vous semble.

Le numéro spécifique d'un magicien n'a pas d'importance. Il peut s'agir de n'importe quel nombre. C'est juste une simulation.


Ajouté :

Corrigé ci-dessus"Mettre en œuvre un accès rapide à une magie spécifique via le numéro de transaction. " .

 

Si on ajoute trois chiffres magiques : 10, 11, 12
Alors quels sont leurs numéros de transaction ? 0, 1, 2 ?

 
Sergey Dzyublik:

Si on ajoute trois chiffres magiques : 10, 11, 12
Alors quels sont leurs numéros de transaction ? 0, 1, 2 ?

Dans un autre fil, des personnes bien informées ont dit qu'il est impossible de fabriquer une solution efficace pour écrire des magiciens sur une corde et les faire sortir rapidement "à la volée" de la corde.

Cependant, à mon avis, si le nombre de mandats futurs est inconnu, alors la seule bonne solution est d'écrire des magiciens à la chaîne.

J'ai fait valoir qu'il n'y aurait pas de perte de vitesse.

Voici une preuve pratique :

//+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=  "_" + (string)order_number + "_" + (string)magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand();
 
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for(int a1 =  0; a1 < Random_orders_of_strategy; a1++)
   {
    int this_magic = MathRand();
    //----------------------------
    Save_magic(this_magic);
    //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic(int deal_number)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =  StringFind(All_magics,"_" + (string)deal_number + "_",0) + 3;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =  StringFind(All_magics,"_" + (string)(deal_number + 1) + "_",0);
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =  StringSubstr(All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return((int)Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1);
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время исполнения функции Get_magic() при количестве ордеров ",Random_orders_of_strategy," равно ",t2 - t1);
   //--------------------------
   Print("Random_orders_of_strategy  ",Random_orders_of_strategy);
   Print("magic 1:  ",Get_magic(1),"  magic 2: ",Get_magic(2),"  magic 3: ",Get_magic(3));
   
  }
//+------------------------------------------------------------------+


Peut-être que quelqu'un trouvera ma solution utile...

(le code trouve la bonne magie parmi plus de 24 000 ordres magiques en 15 microsecondes).

(De plus, pas un octet de mémoire supplémentaire n'est gaspillé).

Si quelqu'un peut le faire plus rapidement, s'il vous plaît.
 
Sergey Dzyublik:

Si on ajoute trois chiffres magiques : 10, 11, 12
Alors quels sont leurs numéros de transaction ? 0, 1, 2 ?

Non. Les numéros de transaction doivent commencer par un.
 

C'est une question intéressante sur le sujet :

Par exemple, il existe un EA multi-devises dans lequel le prochain lot de l'ordre suivant est basé sur les résultats des ordres déjà ouverts sur différentes paires


condition d'ouverture d'un ordre - s'il y a un signal pour l'ouvrir, le lot total ne dépasse pas 0,1 et le drawdown total ne dépasse pas 101% du dépôt.

Première option : remplir toutes les données dans le tableau et les récupérer lorsque le prochain ordre est demandé (nous ne pouvons pas ouvrir de nouveaux ordres à chaque tick).


deuxième option - chaque fois que nous émettons une demande d'ouverture de l'ordre suivant, nous devrions vérifier toutes les données disponibles à l'heure actuelle pour toutes les paires.



Quelle solution sera la plus rapide et la moins coûteuse ?

 

Bummer )