MT 개발자를 위한 것이 아닙니다! INIT_PARAMETERS_INCORRECT를 대체하는 방법? - 페이지 3

 
Georgiy Merts :

그것은 무엇입니까? 수정 사항을 가장 가까운 수정 사항으로 교체 ??? 모든 것이 이러한 수정 사항을 배포하는 방법에 달려 있습니다. 다음 수정 사항은 정상에서 멀어질 가능성이 큽니다.

그리고 잘못된 매개변수 세트 대신 올바른 결과를 얻을 수 있다는 것이 밝혀질 것입니다. 제 생각에는 이 역시 수행할 수 없습니다. 그러면 무엇을 찾을 수 있습니까? 최대값을 구해 보겠습니다. 하지만 잘못된 매개변수 세트가 있습니까?

솔직히 문제가 없다고 봅니다. 그러나 논의된 옵션에 대한 나의 능력은 0입니다.

 
fxsaber :

@Andrey Dik 이 이러한 문제에 도움이 될 수 있다고 생각합니다. 그러나 정규 GA에 대한 건설적인 비판조차도 그에게 좋게 끝나지 않았습니다 ...

금지, 불행히도. 행정부에 금지되지 않은 광선을 보내고 있습니다. 얼마나 할 수 있습니까?

 
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는 포물선의 꼭짓점을 찾지 않습니다.

나는 매트에 대한 검증 어드바이저를 던졌다. 최적화 모드

 // #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의 빨간색 취약점, 약점 및 현재 오류로 표시됩니다.