No para los desarrolladores de MT. ¿Por qué sustituir INIT_PARAMETERS_INCORRECT? - página 3

 
Georgiy Merts:

¿Qué es eso? Sustituyendo las incorrecciones por las correcciones más cercanas... Me temo que todo depende de cómo distribuyamos esas mismas incorrecciones. Es muy posible que las correcciones más cercanas - se alejen de la cima.

Y resultará que en lugar de conjuntos de parámetros erróneos -tendremos resultados correctos-, lo que también, en mi opinión, no debería hacerse -¿qué encontramos entonces? Obtendremos un máximo, y tendrá un conjunto incorrecto de parámetros...

Sinceramente, no veo ningún problema. Sin embargo, mi competencia sobre la variante en cuestión es nula.

 
fxsaber:

Creo que @Andrey Dik puede ayudar en estas cuestiones. Pero incluso la crítica constructiva de la AG regular no terminó bien para él...

Prohibido, por desgracia. Enviando rayos de desbaneo a la administración, bueno, ¿cuánto tiempo más se puede?

 
Georgiy Merts:

¿Qué tal si escribimos una función que sólo dé salida a las cadenas válidas por número?

Lo primero que se me ocurre es una tabla de 117649 valores, y que la genética busque números en esta tabla.

No, la tabla con las cadenas válidas sería mucho más pequeña, pero aunque haya 5000, ¿cómo podemos escribirlas y no confundirnos?

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

No, la tabla con las cadenas correctas será considerablemente más pequeña, pero incluso si hay 5000 de ellas, ¿cómo las deletreas y no te confundes?

A un volcado de archivos. A continuación, busque el número de pase y hágalo coincidir con lo que hay en el archivo.

 
fxsaber:

En el reinicio del archivo. A continuación, ver el número de pase y que coincida con lo que está en el archivo.

Me refiero a cómo no confundir, no repetir, no fallar durante el proceso de prescripción en sí.

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

Me refiero a cómo no confundirse, no repetir, no fallar en el proceso mismo...

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


En este ejemplo, el resultado dependerá en gran medida del orden en que se coloquen los bucles for. Todo por esta peculiaridad.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

No para los desarrolladores de MT. ¿Por qué sustituir INIT_PARAMETERS_INCORRECT?

fxsaber, 2018.07.10 16:27

Obviamente, si se traza una enumeración completa de y = x^2. A continuación, se barajan aleatoriamente las filas de opimización y se crea un nuevo conjunto basado en el barajado. Entonces el AG no encontrará el vértice de la parábola.

 

No hace más de una semana fui baneado por un hilo similar por un momento y el hilo/encuesta fue arrancado como una página innecesaria con raíces.

En cuanto a la pregunta, ya escribí que lo óptimo sería excluir todas las combinaciones prohibidas, esto lo puede hacer de manera óptima el desarrollador, de lo contrario hay que hacer un script que recorra todas las combinaciones y guarde sólo las combinaciones permitidas en un archivo, y ya cargar ese archivo para optimizarlo usando la genética.

 
Me inclino a concluir que el problema del autor está en la arquitectura de su programa.
 
xFFFF:
Me inclino a concluir que el problema del autor está en la arquitectura de su programa.

Gracias por tu opinión, pero aquí no se discute la arquitectura del programa. En caso de que no te hayas dado cuenta...

 
fxsaber:

Obviamente, si se traza una enumeración completa de y = x^2. A continuación, se barajan aleatoriamente las cadenas de opimización y se crea un nuevo conjunto basado en el barajado. El AG no encontrará la cima de la parábola.

He creado un Asesor Experto de prueba para el modo mate del optimizador

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


Marquéen rojo las vulnerabilidades, debilidades y errores actuales de MT5 que aparecieron mientras escribía el ejemplo.

Razón de la queja: