Non per gli sviluppatori di MT! Con cosa sostituire INIT_PARAMETERS_INCORRECT? - pagina 3

 
Georgiy Merts:

Che cos'è? Sostituendo gli errati con le correzioni più vicine ??? Temo che tutto dipenda da come distribuiamo queste stesse incorrezioni. È molto probabile che le correzioni più vicine - saranno lontane dalla cima.

E si scoprirà che invece di set di parametri sbagliati - avremo risultati corretti - che anche, secondo me, non si dovrebbe fare - cosa troviamo allora? Otterremo un massimo, e avrà un set di parametri errato?

Onestamente, non vedo il problema. Tuttavia, la mia competenza sulla variante in discussione è pari a zero.

 
fxsaber:

Penso che @Andrey Dik possa aiutare su questi problemi. Ma anche la critica costruttiva del GA regolare non è finita bene per lui...

Bandito, purtroppo. Mandare raggi di unbanning all'amministrazione, beh, per quanto tempo ancora si può?

 
Georgiy Merts:

Che ne dite di scrivere una funzione che emette solo catene valide per numero?

La prima cosa che viene in mente è una tabella di 117649 valori, e lasciamo che la genetica cerchi dei numeri in questa tabella.

No, la tabella con le catene valide sarebbe molto più piccola, ma anche se ce ne sono 5000, come possiamo scriverle e non confonderci?

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

No, la tabella con le catene corrette sarà notevolmente più piccola, ma anche se ce ne sono 5000, come si fa a scriverle e a non confondersi?

A un file dump. Poi cercate il numero di pass e abbinatelo a quello che c'è nel file.

 
fxsaber:

Nella reimpostazione del file. Poi vedere il numero di pass e abbinarlo a quello che c'è nel file.

Intendevo come non confondere, non ripetere, non perdere durante il processo di prescrizione stesso?

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

Intendevo come non confondersi, non ripetere, non saltare durante il processo di prescrizione stesso?

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 questo esempio, il risultato dipenderà molto dall'ordine in cui i cicli for sono posizionati. Tutto a causa di questa peculiarità.

Forum sul trading, sistemi di trading automatico e test di strategia

Non per gli sviluppatori MT! Con cosa sostituire INIT_PARAMETERS_INCORRECT?

fxsaber, 2018.07.10 16:27

Ovviamente se si traccia un'enumerazione completa di y = x^2. Poi mescolare casualmente le righe di opimizzazione e creare un nuovo set basato sul mescolamento. Allora la GA non troverà il vertice della parabola.

 

Non più di una settimana fa sono stato bannato per un attimo per un thread simile e il thread/sondaggio è stato strappato come una pagina inutile con radici.

Per quanto riguarda la domanda, ho già scritto che sarebbe ottimale escludere tutte le combinazioni che sono proibite, questo può essere fatto in modo ottimale dallo sviluppatore, altrimenti è necessario fare uno script che esegue attraverso tutte le combinazioni e salva solo le combinazioni consentite in un file, e già caricare quel file per l'ottimizzazione utilizzando la genetica.

 
Sono propenso a concludere che il problema dell'autore è nell'architettura del suo programma.
 
xFFFF:
Sono propenso a concludere che il problema dell'autore è l'architettura del suo programma.

Grazie per la tua opinione, ma qui non c'è nessuna discussione sull'architettura del programma. Nel caso non l'abbiate notato...

 
fxsaber:

Ovviamente, se si traccia un'enumerazione completa di y = x^2. Poi mescolare casualmente le righe di opimizzazione e creare un nuovo set basato sul mescolamento. Il GA non troverà la cima della parabola.

Ho creato un Expert Advisor di prova per la modalità mat dell'ottimizzatore

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


Ho segnatoin rosso le vulnerabilità, le debolezze e gli errori attuali di MT5 che sono apparsi durante la scrittura dell'esempio.