MT開発者向けではない!?INIT_PARAMETERS_INCORRECTを何に置き換えたらいいのでしょうか? - ページ 3

 
Georgiy Merts:

それは何ですか?不正解の箇所を最も近い修正箇所に置き換えることで、「?同じ不正でも、それをどう分配するかですべてが決まると思っています。一番近い補正-がトップから離れることは十分あり得ることです。

そして、間違ったパラメーターのセットではなく、正しい結果が得られることが判明するのです。最大値を取得し、その値は誤ったパラメータのセットである?

正直、問題ないと思います。しかし、今議論しているバリアントに関する私の力量はゼロです。

 
fxsaber:

これらの問題については、@Andrey Dikが助けて くれると思います。しかし、通常のGAに対する建設的な批判もうまくいかなかった......。

禁止されています、残念ながら。運営にBAN解除の光線を送る、さて、いつまでできるかな?

 
Georgiy Merts:

有効な鎖だけを番号で出力する関数を書いてみてはどうでしょうか?

まず思いつくのは117649の値の表で、この表から遺伝子が数字を探すようにする。

いや、有効な鎖があるテーブルはもっと小さくなるはずだが、5000本あったとしても、どう書けば混乱しないのか?

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

いや、正しい鎖がある表はかなり小さくなるのですが、5000本あっても、どう綴れば混乱しないのでしょうか。

ファイルダンプにそして、パス番号を調べて、ファイルにあるものと照合します。

 
fxsaber:

ファイルリセットの中へそして、パス番号を見て、ファイルにあるものと照合します。

つまり、処方箋を書く作業そのものを、いかに混乱させないか、繰り返さないか、見逃さないかということです。

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

つまり、処方箋そのものを、いかに混乱させないか、繰り返さないか、見逃さないか、ということです。

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


この例では、forループを配置する順番によって、結果が大きく変わります。すべては、この特殊性のため。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MT開発者向けではありませんINIT_PARAMETERS_INCORRECTを何に置き換えたらいいのでしょうか?

fxsaber さん 2018.07.10 16:27

y = x^2 の完全な列挙をトレースすれば明らかです。次に、オプティマイズの行をランダムにシャッフルし、シャッフルに基づいた新しいセットを作成します。そうすると、GAは放物線の頂点を見つけることができません。

 

一週間も前に似たようなスレッドで一瞬アク禁になり、スレッド/アンケートが根こそぎ不要なページとしてボロボロになったことがありました。

質問に関しては、禁止されている組み合わせをすべて除外することが最適であると既に書きましたが、これは開発者が最適に行うことができます。そうでなければ、すべての組み合わせを実行して、許可された組み合わせだけをファイルに保存し、そのファイルを既にロードしてジェネティクスを使って最適化するスクリプトを作成する必要があります。

 
私は、著者の問題は、プログラムのアーキテクチャにあると結論づけたいと思います。
 
xFFFF:
筆者の問題は、プログラムのアーキテクチャにあると結論づけたい。

ご意見ありがとうございます。しかし、ここではプログラムのアーキテクチャについての議論はしていません。念のために言っておくと...

 
fxsaber:

明らかにy=x^2のフルエニュメーションをトレースすれば。次に、オプティマイズの行をランダムにシャッフルし、シャッフルに基づいた新しいセットを作成します。GAでは放物線の頂点を見つけることができません。

オプティマイザーのマットモードのExpert Advisorをテスト作成しました。

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


例を書いている間に出てきたMT5の脆弱性、弱点、現状のエラーに赤で 印をつけました。