Pas pour les développeurs MT ! Par quoi remplacer INIT_PARAMETERS_INCORRECT ? - page 3

 
Georgiy Merts:

Qu'est-ce que c'est ? En remplaçant les incorrections par les corrections les plus proches ? ?? Je crains que tout dépende de la façon dont nous distribuons ces mêmes incorrections. Il est tout à fait possible que les corrections les plus proches - soient éloignées du sommet.

Et il s'avérera qu'au lieu d'avoir des ensembles de paramètres erronés, nous aurons des résultats corrects - ce qui, à mon avis, ne devrait pas être fait - que trouverons-nous alors ? Nous obtiendrons un maximum, et il aura un ensemble incorrect de paramètres ?

Honnêtement, je ne vois pas de problème. Cependant, ma compétence sur la variante en question est nulle.

 
fxsaber:

Je pense que @Andrey Dik peut vous aider sur ces questions. Mais même une critique constructive de l'AG régulière ne s'est pas bien terminée pour lui...

Interdit, malheureusement. Envoyer des rayons de débanalisation à l'administration, eh bien, combien de temps encore le pouvez-vous ?

 
Georgiy Merts:

Pourquoi ne pas écrire une fonction qui ne produit que les chaînes valides par numéro ?

La première chose qui vient à l'esprit est un tableau de 117649 valeurs, et la génétique cherche des chiffres dans ce tableau.

Non, le tableau des chaînes valides serait beaucoup plus petit, mais même s'il y en a 5000, comment les écrire sans se tromper ?

 
Сергей Таболин:

Non, le tableau contenant les chaînes correctes sera considérablement plus petit, mais même s'il y en a 5000, comment les épeler sans se tromper ?

Vers un fichier de vidage. Cherchez ensuite le numéro du laissez-passer et faites-le correspondre à ce qui se trouve dans le dossier.

 
fxsaber:

Dans le fichier de réinitialisation. Ensuite, voyez le numéro de passe et faites-le correspondre à ce qui est dans le dossier.

Je voulais dire comment ne pas confondre, ne pas répéter, ne pas manquer pendant le processus de prescription lui-même ?

 
Сергей Таболин:

Je voulais dire comment ne pas s'embrouiller, ne pas répéter, ne pas sauter pendant le processus de prescription lui-même ?

input int i1 = 0; 
input int i2 = 0; 
input int i3 = 0; 

sinput int NumPass;

void OnTesterInit()
{
  int StopNumPass = 1;
  
  // Считали оптимизационные параметры входных
  // ...
  
  for (int _i1 = Start1; _i1 < Stop1; _i1 += Step1)
    for (int _i2 = Start2; _i2 < Stop2; _i2 += Step2)
      for (int _i3 = Start2; _i3 < Stop3; _i3 += Step3)
        if (CheckCorrect(_i1, _i2, _i3))
        {
          // записали проход в файл
          //...
          
          StopNumPass++; // см. ниже
        }
        
  // Сбросили оптимизацию входных и назначили NumPass от 1 до StopNumPass с шагом 1.
}


Dans cet exemple, le résultat dépendra beaucoup de l'ordre dans lequel les boucles for sont placées. Tout ça à cause de cette particularité.

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

Pas pour les développeurs MT ! Par quoi remplacer INIT_PARAMETERS_INCORRECT ?

fxsaber, 2018.07.10 16:27

Évidemment, si vous tracez une énumération complète de y = x^2. Ensuite, mélangez aléatoirement les rangées d'opimisation et créez un nouvel ensemble basé sur le mélange. Alors l'AG ne trouvera pas le sommet de la parabole.

 

Il n'y a pas plus d'une semaine, j'ai été banni pour un fil similaire pendant un moment et le fil/enquête a été supprimé comme une page inutile avec des racines.

Pour ce qui est de la question, j'ai déjà écrit qu'il serait optimal d'exclure toutes les combinaisons interdites, cela peut être fait de manière optimale par le développeur, sinon il faut faire un script qui passe en revue toutes les combinaisons et enregistre seulement les combinaisons autorisées dans un fichier, et déjà charger ce fichier pour l'optimisation en utilisant la génétique.

 
Je suis enclin à conclure que le problème de l'auteur réside dans l'architecture de son programme.
 
xFFFF:
Je suis enclin à conclure que le problème de l'auteur est lié à l'architecture de son programme.

Merci pour votre opinion, mais il n'y a pas de discussion ici sur l'architecture du programme. Au cas où vous n'auriez pas remarqué...

 
fxsaber:

Évidemment, si vous tracez une énumération complète de y = x^2. Ensuite, mélangez aléatoirement les rangées d'opimisation et créez un nouvel ensemble basé sur le mélange. L'AG ne trouvera pas le sommet de la parabole.

J'ai créé un conseiller expert de test pour le mode mat de l'optimiseur.

// #define TESTER_FILE // Советник будет работать не только на локальных Агентах, но и в Облаке.

#ifdef  TESTER_FILE
// Нужно компилировать (не запускать) советник, когда этот файл (с любым содержанием, хоть пустой) лежит в Песочнице.
// Иначе Тестер не будет видеть эти данные, даже если соответствующий файл с ними положить после компиляции на место.  
  #property tester_file __FILE__ 
  
  const int FileCommon = 0;
#else
  const int FileCommon = FILE_COMMON;
#endif // TESTER_FILE

sinput bool Rand = false;     // Вкл/выкл. перемешивание
sinput int NumPass = 10001;   // Количество проходов

// Фитнесс-функция
double Func( const double X )
{
//  return(X); // Проверка, что Агенты считывают нужные данные
  return(-X * X + 1); // Парабола с максимальным значением в единице - его и будем искать
}

// Меняет местами элементы массива
template <typename T>
void Swap( T &Array[], const uint Pos1, const uint Pos2 )
{
  const T Tmp = Array[Pos1];
  
  Array[Pos1] = Array[Pos2];
  Array[Pos2] = Tmp;
}

// Возвращает случайный индекс массива
uint GetRandPos( const uint Size )
{
  return(MathRand() * (Size - 1) / SHORT_MAX);
}

// Перемешивает элементы массива
template <typename T>
void Mixing( T &Array[], const uint AmountIterations )
{
  const int Size = ArraySize(Array);

  MathSrand((uint)TimeLocal()); // Повторные запуски Оптимизатор будет игнорировать - build 1881
  
  for (uint i = 0; i < AmountIterations; i++)
    Swap(Array, GetRandPos(Size), GetRandPos(Size));
}

// Вычисляет интервал оптимизации
void SetInterval( double &Array[], const double Begin, const double End, const uint Amount )
{
  if (Amount > 1)
  {
    const double Step = (Begin - End) / (Amount - 1);
    double Tmp = End;
    
    for (int i = ArrayResize(Array, Amount) - 1; i >= 0; i--, Tmp += Step)    
      Array[i] = NormalizeDouble(Tmp, 8);
  }  
}

#define  TOSTRING(A) #A

void OnTesterInit()
{
  ParameterSetRange(TOSTRING(NumPass), true, 0, 0, 1, NumPass - 1); // Задали Оптимизатору количество проходов = NumPass
  
  double Array[];
  
  SetInterval(Array, -1, 1, NumPass); // Выстроили значения интервала по порядку
  
  if (Rand)
    Mixing(Array, NumPass * 10); // Перемешали все в интервале
    
//  ArrayPrint(Array); // Проверка, что Агенты считывают нужные данные
    
  FileSave(__FILE__, Array, FileCommon); // Записали файл-интервал. А ведь так можно передать в Облако хоть содержимое всей Песочницы + полный стейтмент.
}

void OnTesterDeinit()
{
  if (FileCommon)
    FileDelete(__FILE__, FileCommon); // Удалили файл-интервал
  
  ChartClose(); // Закрыли чарт Frame-выполнения советника
}

double OnTester()
{
  double Array[];
  
  // Считали точку из интервала и вернули значение фитнесс-функции в ней
  return((FileLoad(__FILE__, Array, FileCommon) != -1) ? Func(Array[NumPass]): 0); // В режиме не-tester_file FileLoad будет выдавать ошибку, если два Агента одновременно обратятся.
}


J'ai marquéen rouge les vulnérabilités, les faiblesses et les erreurs courantes de MT5 qui sont apparues lors de la rédaction de l'exemple.