오류, 버그, 질문 - 페이지 741

 
ivandurak :

나에 대한 무화과 설명. 다시 한번 시도해 보겠습니다. 작업은 통화 포트폴리오를 구성하는 것입니다. 각 통화에는 고유한 매개변수가 있습니다. 최적화된 포트폴리오에서는 통화가 참여하지 않을 수 있습니다. 각 통화에 대해 21개의 최적화 단계가 있는 6개 통화에 대한 몇 가지 계산은 총 수십억 개의 무화과 계정입니다.

이제 질문입니다. 통화가 플래그와 거래하는 것을 금지하면 매개 변수를 최적화할 필요가 없습니다. 어쨌든 결과에 영향을 미치지는 않지만 최적화 프로그램은 정기적으로 결과에 영향을 미치지 않는 매개 변수를 선택하려고 시도합니다. 이 빈 실행은 약간 성가시다(3일이 이미 지났습니다). 불가능하다는 걸 스스로도 알고 있는 것 같지만 아직 희망은 희미하다.

네, 맞습니다. 추가 패스가 있을 것입니다. 그러나 이것은 최적화의 복잡한 시작의 변형입니다.

TS가 허용하는 경우 이미 답변한 대로 각 쌍을 개별적으로 최적화하고 자신을 위해 단일 다중 통화 실행을 수행합니다.

일반적인 최적화는 IMHO가 매직 헤징의 함정에 빠지는 것을 의미합니다)))).

다른 해결책이 있습니다.내가 제안한 것과 반대 방향이지만 불필요한 실행을 줄입니다.

예를 들어, 매개변수 100의 반복 범위는 50-150입니다. false에 대해 하나의 값을 선택하십시오.

따라서 옵션의 수가 한 차원 줄어들고 유전학이 해결됩니다.

 input bool trpar2= true ; // вЫключен флажок
input int grusdchf= 100 ; // включен флажок перебора 49-150
input int grusdjpy= 100 ; // включен флажок перебора 50-150

if (grusdchf== 49 )   // если 49 то запрет торговли
  {
   x_trpar2= false ;
  }
 else                // иначе берет установленное значение флага и параметров
  {
   x_trpar2=trpar2;
  }

// далее по коду для запрета используем x_trpar2
 
ivandurak :

나에 대한 무화과 설명. 다시 한번 시도해 보겠습니다. 작업은 통화 포트폴리오를 구성하는 것입니다. 각 통화에는 고유한 매개변수가 있습니다. 최적화된 포트폴리오에서는 통화가 참여하지 않을 수 있습니다. 각 통화에 대해 21개의 최적화 단계가 있는 6개 통화에 대한 몇 가지 계산은 총 수십억 개의 무화과 계정입니다.

이제 질문입니다. 통화가 플래그와 거래하는 것을 금지하면 매개 변수를 최적화할 필요가 없습니다. 어쨌든 결과에 영향을 미치지는 않지만 최적화 프로그램은 정기적으로 결과에 영향을 미치지 않는 매개 변수를 선택하려고 시도합니다. 이 빈 실행은 약간 성가시다(3일이 이미 지났습니다). 불가능하다는 걸 스스로도 알고 있는 것 같지만 아직 희망은 희미하다.

각 쌍에 대해 Init() 및 Trade()와 같은 것이 있고 매개변수가 이미 선택되어 있는 경우 지분을 결정하는 작업만 남으면 문제가 해결됩니다. 불행히도 일반적으로 많은 시스템에서 해결할 수 없었습니다.

따라서 "시스템 공유" 단계를 설정해야 합니다. 6개 시스템의 경우 패스 수는 f-s로 계산됩니다.

 int PartCount6( double _mult) {
   int __= ( int )( 1.0 / _mult) + 1 ;
   int x, y, z, t, t1, t2, count = 0 ;
   for (t = 0 ; t < __; ++t) for (x = 0 ; x < __; ++x) 
       for (y = 0 ; y < __; ++y) for (z = 0 ; z < __; ++z) 
         for (t1 = 0 ; t1 < __; ++t1) for (t2 = 0 ; t2 < __; ++t2) 
             if (x + y + z + t + t1 + t2 == __- 1 ) ++count;
   return (count);     
}

이에 대한 스크립트를 만들 수 있습니다.

 input double Mult = 0.04 ;

void OnStart () {
   Alert (PartCount6(Mult));
}

또한 최적화할 작업에는 1에서 1단계로 PartCount6(Mult)까지 Mult(최적화되지 않음) 및 부분의 두 가지 매개변수가 있습니다. 그럼 예를 들면 다음과 같습니다.

 input double Mult  = 0.04 ;
input int     part = 3276 ;

CZ1 gbp;
CZ2 jpy;
CZ3 eursek, eur;
CZ4 audcad, sek;

int x, y, z, t, t1, t2; 

int OnInit () {
   int __= ( int )( 1.0 / Mult) + 1 ;
   int count = 0 ;
   for (x = 0 ; x < __; ++x) {
       for (y = 0 ; y < __; ++y) {
         for (z = 0 ; z < __; ++z) {
             for (t = 0 ; t < __; ++t) {
               for (t1 = 0 ; t < __; ++t1) {
                   for (t2 = 0 ; t2 <__; ++t2) { 
                     if (x + y + z + t + t1 + t2 == __- 1 ) {
                        ++count;
                         if (count == part) break ; // Вот где goto был бы полезен, или break n
                     }
                  }
                   if (count == part) break ;
               }
               if (count == part) break ; 
            }
             if (count == part) break ;
         }
         if (count == part) break ;
      }
       if (count == part) break ;
   }
   if (x) gbp.Init(..); //его доля - x * Mult, т. е., нужно в Init долю передавать как параметр
   if (y) jpy.Init(..); 
   if (z) eur.Init(..);
   if (t) eursek.Init(..);
   if (t1) audcad.Init(..);
   if (t2) sek.Init(...);
}

void OnTick () {
   if (x) gbp.Trade();
   if (y) jpy.Trade();
   if (z) eur.Trade();
   if (t) eursek.Trade();
   if (t1) audcad.Trade();
   if (t2) sek.Init(Trade);
}

단계가 작을수록 주기에서 더 많은 단계를 거쳐야 한다는 점을 명심하십시오. 예를 들어 통과 횟수를 세는 스크립트가 5분 이상 값을 반환하지 않으면 단계를 줄이는 것이 좋습니다. 단계를 줄이지 않으려면 예를 들어 통화를 반으로 나누고 각 그룹을 최적화한 다음 다시 "그룹으로" 함께 사용합니다. (그리고 시스템 상관 관계를 사용하고 쌍으로 최적화하는 것이 훨씬 더 좋습니다. 그러면 주기가 그렇게 무섭지 않지만 그건 또 다른 이야기입니다.)

다른 수의 시스템(적어도 더 작은 시스템, 최소 더 큰 시스템)의 경우 모든 것이 유추입니다.

 

거의 잊어 버렸습니다. 최적화 후에는 공유를 찾아야합니다. 그래서 우리는 가장 좋아하는 단일 패스를 시작하고 OnDeinit에서 작성합니다.

 void OnDeinit ( const int reason) {
   Print ( "x:" , x * Mult, "; y:" , y * Mult, "; z:" , z * Mult, "; t:" , t * Mult, "; t1:" , t1 * Mult, "; t2:" , t2 * Mult);
}
 

나는 1년 전에 이 버그를 발견하고 테스트했으며 포럼에서 언급하기까지 했습니다.

밝혀진 대로 그는 아직 살아 있습니다.

결론: 가상 함수 가 생성자에서 호출될 때 호출되는 것은 기본 함수가 아니라 조상 함수입니다.

 class COracleTemplate
  {
private :
public :
   string             ClassName;
                     COracleTemplate(){Init();};
                    ~COracleTemplate(){DeInit();};
   virtual void       Init(){ClassName= this .Name(); Print ( "loadSettings from " ,ClassName);};
   virtual void       DeInit(){ Print ( "saveSettings to " ,ClassName);};
   virtual string     Name(){ return ( "Prpototype" );};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CCO2: public COracleTemplate
  {
   virtual string     Name(){ return ( "CO2" );};
  };
class CH2O: public COracleTemplate
  {
   virtual string     Name(){ return ( "H2O" );};
  };
COracleTemplate* CO2,*H2O;
void OnStart ()
  {
   CO2= new CCO2;
   CO2.Init();
   Print (CO2.Name(), " ClassName=" ,CO2.ClassName);
   delete CO2;
   
   H2O= new CH2O;
//   H2O.Init();
   Print (H2O.Name(), " ClassName=" ,H2O.ClassName);
   delete H2O;
  }

인쇄물:

 2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        saveSettings to Prpototype
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        H2O ClassName=Prpototype
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        loadSettings from Prpototype
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        saveSettings to CO2
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        CO2 ClassName=CO2
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        loadSettings from CO2
2012.05 . 18 14 : 13 : 48      VirtualTest (EURUSD,M15)        loadSettings from Prpototype

이것이 버그라면 수정하십시오.

기능이라면 도움말에서 자세히 강조 표시하고 이점이 무엇인지 설명하십시오.

피할 수 없는 악이라면 - 특히 특수 상자의 도움말에 언급하십시오.

그렇지 않으면 프로그램에서 버그를 찾는 데 오랫동안 미쳐 있지 않을 것입니다.

파일:
 

조상 생성자는 자식과 가상 함수 에 대해 아무 것도 모릅니다.

객체는 어떻게 구성됩니까?

1. 먼저 "기본 계층" 생성자가 호출됩니다. 가상 기능 테이블을 노출합니다. 조상은 상속 계층을 따르는 자손에 대해 아무것도 모르고, 자손의 가상 기능 테이블은 아직 존재하지 않습니다.

2. 계층에서 다음 자식의 생성자가 호출됩니다. 이 자식은 자체 가상 기능 테이블을 노출합니다. 동시에 조상의 기능(가상 기능 포함)은 자손에서 사용할 수 있습니다. 그러나 이 후손은 계층 구조에서 자신을 따르는 후손에 대해 아무 것도 모릅니다(문단 1에서와 같이).

3. 2단계는 계층이 끝날 때까지 반복됩니다.

요약. 생성자에서 가상 함수를 사용하지 마십시오. 예, 소멸자에서도 마찬가지입니다.

 
MetaDriver :

피할 수 없는 악이라면 - 특히 특수 상자의 도움말에 언급하십시오.

따라서 생성자가 완료되기 전과 소멸자가 시작된 후에 가상 함수 를 호출하지 않는 것이 일반적인 관행입니다.
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 
stringo :

조상 생성자는 자식과 가상 함수 에 대해 아무 것도 모릅니다.

객체는 어떻게 구성됩니까?

1. 먼저 "기본 계층" 생성자가 호출됩니다. 가상 기능 테이블을 노출합니다. 조상은 상속 계층을 따르는 자손에 대해 아무것도 모르고, 자손의 가상 기능 테이블은 아직 존재하지 않습니다.

2. 계층에서 다음 자식의 생성자가 호출됩니다. 이 자식은 자체 가상 기능 테이블을 노출합니다. 동시에 조상의 기능(가상 기능 포함)은 자손에서 사용할 수 있습니다. 그러나 이 후손은 계층 구조에서 자신을 따르는 후손에 대해 아무 것도 모릅니다(문단 1에서와 같이).

3. 2단계는 계층이 끝날 때까지 반복됩니다.

요약. 생성자에서 가상 함수를 사용하지 마십시오. 예, 소멸자에서도 마찬가지입니다.

확인. 그러나 여전히 도움이되는 경우 모든 것이 그렇다면 눈에 잘 띄는 곳에 표시하십시오.

일반적으로 어셈블리의 계층 구조(내가 상상한 대로)가 아니라 생성자에서 VMT가 추가되는 위치에 관한 것입니다. 처음(사용자가 작성한 코드 이전)에 추가하면 이 문제는 없는 것 같고 후속 코드는 이미 가상 함수를 호출할 수 있습니다. 불가능하거나 바람직하지 않거나.. ?

더엑스퍼트 :
따라서 생성자가 완료되기 전과 소멸자가 시작된 후에 가상 함수 를 호출하지 않는 것이 일반적인 관행입니다.

글쎄, 나는 다른 OO 언어에 대한 경험이 있음에도 이것에 대해 아무것도 몰랐습니다. 아마도 생성자 내부에서 가상 호출을 할 필요가 자주 없기 때문일 것입니다.

 
MetaDriver :

확인. 그러나 여전히 도움말에서 모든 것이 그렇다면 눈에 잘 띄는 곳에 표시하십시오.


이 사실은 여러 곳에서 문서에 반영될 것입니다.
 
stringo :
이 사실은 여러 곳에서 문서에 반영될 것입니다.

큰 확인.

감사합니다. (일반 개발을 위해) 생성자의 시작 부분(선조 초기화 후)에서 가상 메서드 테이블을 초기화할 수 없는 이유를 물어볼 수 있습니다.

--

어떤 경우에는 생성자에서 가상 호출이 있는 코드가 매우 편리할 수 있습니다. 신선한 예: 생성자에서 직접 파일의 개체를 로드하고 싶었습니다. 가상 함수에서 반환된 유형 식별자와 비교하여 로드하는 동안 유형을 직접 확인하도록 계획되었습니다. 생성자에서 가상 호출이 불가능하기 때문에 문제가 있었습니다. 문제를 해결했지만 계획만큼 우아하지 않았습니다.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 
MetaDriver :
그래서 공장을 만드십시오. 문제가 해결됩니다.
사유: