Nicht für MT-Entwickler! Wodurch soll INIT_PARAMETERS_INCORRECT ersetzt werden? - Seite 3

 
Georgiy Merts:

Was ist das? Durch das Ersetzen der Fehler durch die nächstgelegenen Korrekturen ??? Ich fürchte, es hängt alles davon ab, wie wir diese Fehler verteilen. Es ist gut möglich, dass die nächsten Korrekturen nicht mehr an der Spitze liegen werden.

Und es wird sich herausstellen, dass wir statt falscher Parametersätze richtige Ergebnisse haben werden - was meiner Meinung nach auch nicht gemacht werden sollte - was finden wir dann? Wir werden ein Maximum erhalten, und es wird einen falschen Satz von Parametern haben ?

Ehrlich gesagt, sehe ich da kein Problem. Allerdings ist meine Kompetenz bei der zur Diskussion stehenden Variante gleich null.

 
fxsaber:

Ich denke, dass @Andrey Dik bei diesen Fragen helfen kann. Aber selbst die konstruktive Kritik am regulären GA hat nicht gut für ihn geendet...

Leider verboten. Wie lange können Sie noch Strahlen zur Aufhebung des Verbots an die Verwaltung senden?

 
Georgiy Merts:

Wie wäre es, eine Funktion zu schreiben, die nur gültige Ketten nach Nummern ausgibt?

Das erste, was uns in den Sinn kommt, ist eine Tabelle mit 117649 Werten, und lassen Sie die Genetik nach Zahlen in dieser Tabelle suchen.

Nein, die Tabelle mit den gültigen Ketten wäre viel kleiner, aber selbst wenn es 5000 davon gibt, wie können wir sie schreiben, ohne durcheinander zu kommen?

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

Nein, die Tabelle mit den richtigen Ketten wird wesentlich kleiner sein, aber selbst wenn es 5000 davon gibt, wie buchstabiert man sie und kommt nicht durcheinander?

Zu einem Dateidump. Suchen Sie dann die Nummer des Ausweises und gleichen Sie sie mit der Datei ab.

 
fxsaber:

In die Datei zurücksetzen. Dann sehen Sie sich die Passnummer an und gleichen sie mit der in der Datei ab.

Ich meinte, wie man während des Verschreibungsprozesses selbst nicht verwirrt, nicht wiederholt, nicht übersehen kann?

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

Ich meinte, wie man sich nicht verwirren lässt, sich nicht wiederholt und den Prozess nicht verpasst?

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.
}


In diesem Beispiel hängt das Ergebnis stark von der Reihenfolge ab, in der die for-Schleifen angeordnet sind. Und das alles nur wegen dieser Besonderheit.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Nicht für MT-Entwickler! Wodurch soll INIT_PARAMETERS_INCORRECT ersetzt werden?

fxsaber, 2018.07.10 16:27

Offensichtlich, wenn Sie eine vollständige Aufzählung von y = x^2 verfolgen. Dann mischen Sie die Optimierungszeilen nach dem Zufallsprinzip und erstellen eine neue Menge auf der Grundlage dieser Mischung. Dann wird die GA den Scheitelpunkt der Parabel nicht finden.

 

Vor nicht mehr als einer Woche wurde ich für einen ähnlichen Thread kurzzeitig gesperrt und der Thread/die Umfrage wurde als unnötige Seite mit Wurzeln herausgerissen.

Was die Frage angeht, habe ich bereits geschrieben, dass es optimal wäre, alle Kombinationen, die verboten sind, auszuschließen, dies kann optimal vom Entwickler gemacht werden, ansonsten muss man ein Skript machen, das alle Kombinationen durchläuft und nur erlaubte Kombinationen in einer Datei speichert, und diese Datei bereits zur Optimierung mit Genetik laden.

 
Ich neige zu dem Schluss, dass das Problem des Autors in der Architektur seines Programms liegt.
 
xFFFF:
Ich neige zu dem Schluss, dass das Problem des Autors in der Architektur seines Programms liegt.

Danke für Ihre Meinung, aber es gibt hier keine Diskussion über die Architektur des Programms. Falls Sie es noch nicht bemerkt haben...

 
fxsaber:

Offensichtlich, wenn Sie eine vollständige Aufzählung von y = x^2 verfolgen. Dann mischen Sie die Optimierungszeilen nach dem Zufallsprinzip und erstellen eine neue Menge auf der Grundlage dieser Mischung. Die GA wird den Scheitelpunkt der Parabel nicht finden.

Ich habe einen Test Expert Advisor für den Optimierungsmodus "Matte" erstellt

// #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 будет выдавать ошибку, если два Агента одновременно обратятся.
}


Ich habe die Anfälligkeiten, Schwächen und aktuellen Fehler von MT5, die beim Schreiben des Beispiels auftraten,rot markiert.