¿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.
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.
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__constint FileCommon = 0;
#else
constint FileCommon = FILE_COMMON;
#endif // TESTER_FILEsinputbool Rand = false; // Вкл/выкл. перемешиваниеsinputint NumPass = 10001; // Количество проходов// Фитнесс-функцияdouble Func( constdouble X )
{
// return(X); // Проверка, что Агенты считывают нужные данныеreturn(-X * X + 1); // Парабола с максимальным значением в единице - его и будем искать
}
// Меняет местами элементы массиваtemplate <typename T>
void Swap( T &Array[], constuint Pos1, constuint Pos2 )
{
const T Tmp = Array[Pos1];
Array[Pos1] = Array[Pos2];
Array[Pos2] = Tmp;
}
// Возвращает случайный индекс массиваuint GetRandPos( constuint Size )
{
return(MathRand() * (Size - 1) / SHORT_MAX);
}
// Перемешивает элементы массиваtemplate <typename T>
void Mixing( T &Array[], constuint AmountIterations )
{
constint Size = ArraySize(Array);
MathSrand((uint)TimeLocal()); // Повторные запуски Оптимизатор будет игнорировать - build 1881for (uint i = 0; i < AmountIterations; i++)
Swap(Array, GetRandPos(Size), GetRandPos(Size));
}
// Вычисляет интервал оптимизацииvoid SetInterval( double &Array[], constdouble Begin, constdouble End, constuint Amount )
{
if (Amount > 1)
{
constdouble 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
voidOnTesterInit()
{
ParameterSetRange(TOSTRING(NumPass), true, 0, 0, 1, NumPass - 1); // Задали Оптимизатору количество проходов = NumPassdouble Array[];
SetInterval(Array, -1, 1, NumPass); // Выстроили значения интервала по порядкуif (Rand)
Mixing(Array, NumPass * 10); // Перемешали все в интервале// ArrayPrint(Array); // Проверка, что Агенты считывают нужные данныеFileSave(__FILE__, Array, FileCommon); // Записали файл-интервал.А ведь так можно передать в Облако хоть содержимое всей Песочницы + полный стейтмент.
}
voidOnTesterDeinit()
{
if (FileCommon)
FileDelete(__FILE__, FileCommon); // Удалили файл-интервалChartClose(); // Закрыли чарт Frame-выполнения советника
}
doubleOnTester()
{
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.
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
¿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.
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?
¿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.
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...
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.
Gracias por tu opinión, pero aquí no se discute la arquitectura del programa. En caso de que no te hayas dado cuenta...
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
Marquéen rojo las vulnerabilidades, debilidades y errores actuales de MT5 que aparecieron mientras escribía el ejemplo.