Não para desenvolvedores de MT! O que substituir INIT_PARAMETERS_INCORRECT por ? - página 3

 
Georgiy Merts:

O que é isso? Substituindo as incorreções pelas correções mais próximas ??? Receio que tudo dependa de como distribuímos essas mesmas incorreções. É bem possível que as correções mais próximas - estejam longe do topo.

E vai acontecer que ao invés de conjuntos errados de parâmetros - teremos resultados corretos - o que, em minha opinião, também não deveria ser feito - o que encontramos então? Teremos um máximo, e terá um conjunto incorreto de parâmetros ?

Sinceramente, não vejo nenhum problema. Entretanto, minha competência sobre a variante em discussão é zero.

 
fxsaber:

Creio que @Andrey Dik pode ajudar nestas questões. Mas mesmo as críticas construtivas à AG regular não terminaram bem para ele.

Proibido, infelizmente. Envio de raios de desbanalização para a administração, bem, quanto tempo mais você pode?

 
Georgiy Merts:

Que tal escrever uma função que só produz cadeias válidas por número ?

A primeira coisa que me vem à mente é uma tabela de 117649 valores, e deixar a genética procurar os números nesta tabela.

Não, a mesa com correntes válidas seria muito menor, mas mesmo que haja 5000 delas, como podemos escrevê-las e não ficar confusos?

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

Não, a mesa com as correntes corretas será consideravelmente menor, mas mesmo que haja 5000 delas, como soletrá-las e não ficar confuso?

Para um depósito de arquivos. Em seguida, procure o número do passe e faça a correspondência com o que está no arquivo.

 
fxsaber:

Para o arquivo reinicializado. Em seguida, veja o número do passe e faça a correspondência com o que está no arquivo.

Como não confundir, não repetir, não errar durante o próprio processo de prescrição?

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

Eu queria dizer como não ficar confuso, não repetir, não pular durante o próprio processo de prescrição?

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


Neste exemplo, o resultado dependerá fortemente da ordem na qual os loops são colocados. Tudo devido a esta peculiaridade.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Não para desenvolvedores da MT! O que substituir INIT_PARAMETERS_INCORRECT por ?

fxsaber, 2018.07.10 16:27

Obviamente, se você traçar uma enumeração completa de y = x^2. Em seguida, embaralhar aleatoriamente as linhas de opimização e criar um novo conjunto com base no embaralhamento. Então a AG não encontrará o vértice da parábola.

 

Não mais de uma semana atrás fui banido por um momento por um fio semelhante e o fio/levantamento foi arrancado como uma página desnecessária com raízes.

Quanto à questão, já escrevi que seria ótimo excluir todas as combinações que são proibidas, isto pode ser feito de forma otimizada pelo desenvolvedor, caso contrário é preciso fazer um roteiro que percorra todas as combinações e salve apenas as combinações permitidas em um arquivo, e já carregar esse arquivo para otimização usando a genética.

 
Estou inclinado a concluir que o problema do autor está na arquitetura de seu programa.
 
xFFFF:
Estou inclinado a concluir que o problema do autor é com a arquitetura de seu programa.

Obrigado por sua opinião, mas não há aqui nenhuma discussão sobre a arquitetura do programa. Caso você não tenha notado...

 
fxsaber:

Obviamente, se você traçar uma enumeração completa de y = x^2. Em seguida, embaralhar aleatoriamente as cordas de opimização e criar um novo conjunto com base no embaralhamento. A AG não vai encontrar o topo da parábola.

Eu criei um Expert Advisor de teste para o modo mate do otimizador

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


Eu marqueiem vermelho as vulnerabilidades, fraquezas e erros atuais do MT5 que apareceram enquanto escrevia o exemplo.