Optimisation des algorithmes. - page 9

 
Andrey Dik:
Oui, c'est ce que j'ai fait.
mais il y a souvent des ticks sur le même personnage avec le même temps, quand il y a plusieurs ticks dans une milliseconde
C'est là que je suis coincé dans la logique.

pour des raisons pratiques, je devrais probablement prendre le pire scénario.

 

Il y a des numéros de StartN à EndN inclus.

Vous devez faire des combinaisons de CountN dans chaque

J'ai écrit ce script pour le nombre de chiffres dans une combinaison de 3 :

input int      StartN = 0;
input int      EndN   = 1;
input int      CountN = 5;

void OnStart()
{
  string str = "";
  
  //уровень 0
  for (int i = StartN; i <= EndN; i++)
  {
    //str = StringSubstr (str, 0, 0);
    //str += (string)i;
    str = (string)i;
    
    //уровень 1
    for (int k = StartN; k <= EndN; k++)
    {
      str = StringSubstr (str, 0, 1);
      str += (string)k;
      
      //уровень 2
      for (int l = StartN; l <= EndN; l++)
      {
        str = StringSubstr (str, 0, 2);
        str += (string)l;
        
        Print (str);
      }
    }
  }
}

qui sort :

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD...,H4 : 111

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD..,H4 : 110

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD..,H4 : 101

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD..,H4 : 100

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD..,H4 : 011

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD..,H4 : 010

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD..,H4 : 001

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD..,H4 : 000

Je suis confus, comment puis-je le faire fonctionner avec un nombre spécifié de CountN ?

 

La représentation binaire d'un nombre...

 
Aliaksandr Hryshyn:

Représentation binaire d'un nombre...

ce n'est pas la question, c'est juste les paramètres que j'ai pris, de 0 à 1 inclus.

Prenez [0;2]

et vous obtenez :

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4 : 222

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 221

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 220

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 212

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 211

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 210

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 202

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 201

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 200

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 122

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 121

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 120

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 112

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 111

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 110

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 102

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 101

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 100

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 022

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 021

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 020

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 012

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 011

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 010

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 002

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 001

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 000

 
Andrey Dik:

Il y a des numéros de StartN à EndN inclus.

J'ai besoin de faire des combinaisons de CountN dans chaque

Je suis confus, comment faire pour que cela fonctionne avec un nombre donné de CountN ?

Je pense que j'ai déjà fait cela avant, voici le sujet

https://www.mql5.com/ru/forum/335077

 
Andrey Dik:

ce n'est pas ça, c'est juste que j'ai pris les paramètres de 0 à 1 inclus.

prendre [0;2]

et on obtient :

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4 : 222

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD..,H4 : 221

...

Le problème se résume donc à convertir le numéro de la boucle principale dans un autre système numérique, plus une correction pour StartN

 
Aliaksandr Hryshyn:

Le problème se résume donc à convertir le numéro de la boucle principale dans un autre système numérique, plus une correction pour StartN

Je peux avoir le code ?

 
Igor Makanu:

Je pense que j'ai déjà fait ça avant, voici un fil de discussion

https://www.mql5.com/ru/forum/335077

Tout n'est pas parfait avec le code, mais il semble correspondre à ce dont j'ai besoin, je vais le corriger et le poster ici.

maintenant le code ne génère pas les combinaisons de pleine longueur

 
Igor Makanu:

Je pense que j'ai déjà fait cela auparavant, voici un fil de discussion

https://www.mql5.com/ru/forum/335077

Je n'ai pas obtenu ce dont j'avais besoin, le code comporte trop de boucles dont le but n'est pas clair.

Ma solution est la suivante :

#property script_show_inputs

//--- input parameters
input int      StartN = 0;
input int      EndN   = 1;
input int      CountN = 3;

void OnStart ()
{
  string base [];
  
  //алгоритм сочетаний без повторений
  CombinationGenerator (StartN, EndN, CountN, base);

  //выведем полученные комбинации в принт
  for (int i = 0; i < ArraySize (base); i++) Print (base [i]);
}

string CreateString (int &base [])
{
  string s = "";
  for (int i = 0; i < ArraySize (base); i++) s += (string)base [i];

  return s;
}

//Алгоритм сочетаний без повторений
void CombinationGenerator (int startN, int endN, int rowLen, string &base [])
{
  ArrayResize (base, (int)pow (EndN - StartN + 1, CountN));
  int comb [];
  ArrayResize (comb, CountN);
  ArrayInitialize (comb, StartN);
  string str = "";
  int pos = 0;
  base [pos] = CreateString (comb);

  bool flag = true;

  while (flag && !IsStopped ())
  {
    for (int l = 0; l < CountN; l++)
    {
      if (comb [l] + 1 <= EndN)
      {
        comb [l] += 1;

        pos++;
        base [pos] = CreateString (comb);
        break;
      }
      else
      {
        if (l == CountN - 1) flag = false;
        comb [l] = StartN;
      }
    }
  }
}

J'assume ce code avec le moins d'itérations possible.

résultat à [0;1] numéros avec le numéro dans la ligne 3 :

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5 : 111

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..,M5 : 011

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..,M5 : 101

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..,M5 : 001

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..,M5 : 110

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..,M5 : 010

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..,M5 : 100

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..,M5 : 000

résultat pour les valeurs [0;2] avec le numéro dans la ligne 4 :

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2222

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1222

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0222.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2022

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1022

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0022.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2020.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1020

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0020

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 2000

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 1000

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5 : 0000

La logique de l'algorithme est simple et identique à la règle de calcul : ajouter 1 au chiffre, si le chiffre contient plus que le nombre que nous avons fixé comme minimum et passer au chiffre suivant, s'il n'y a pas de "mise à zéro" au chiffre suivant, nous revenons au premier.

C'est vrai, les chiffres que je n'ai pas à droite mais à gauche, eh bien, oups.

0000

0001

0010

0011

0100

0101

....

etc.


Il est possible d'obtenir un code encore plus beau en utilisant la récursion, mais il est peu probable que cela soit plus rapide.

 
Andrey Dik:

votre exemple n'est pas une combinaison mais une permutation sans répétition

et mon exemple est une combinaison sans répétition

Raison: