MQL5의 OOP에 대한 질문 - 페이지 39

 

Volchansky가 여기에서 충분하지 않은 이유는 이제 이상하지 않습니다. 내부자 미리보기 또는 그가 사용하는 모든 것))


3개월 전에 오프사이트에서 win 10home을 다운로드했는데 기본 설정을 할 시간조차 없었습니다. 시작 아이콘 설정이 열리지 않습니다. 네 ***********

 
Koldun Zloy :

다음은 예입니다.

나는 당신의 예를 내 작업에 완전히 적용하려고 시도했지만 다시 같은 레이크 - 기본 클래스에서 새 자식을 만들 때 "레코드 필요" 플래그로 끝내고 싶습니다.

 //+------------------------------------------------------------------+
class CStrategy
{
private :
   int f_save_required;
protected :
   int set;
   void               SaveRequiredFlags ( const bool flag)                      { f_save_required++;  }
   int                SaveRequiredFlags ( void ) const                            { return (f_save_required); }
public :
                     CStrategy():f_save_required( 0 )                           {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                     CStrategy( int setting):set(setting),f_save_required( 0 )   {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                    ~CStrategy(){}

};
//+------------------------------------------------------------------+
class A: public CStrategy
{
public :
   void               SaveRequired ( void )                                      { SaveRequiredFlags( true );                         }
   int                getSaveRequired ( void ) const                              { return (SaveRequiredFlags());                     }
                     A( int st_setting) : CStrategy(st_setting){}
                    ~A(){}
};
//+------------------------------------------------------------------+
class B: public CStrategy
{
public :
   void               SaveRequired( void )                                       { SaveRequiredFlags( true );                         }
   int                getSaveRequired ( void ) const                              { return (SaveRequiredFlags());                     }
                     B( int st_setting) : CStrategy(st_setting){}
                    ~B(){}
};
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   A *a = new A( 1 );
   B *b = new B( 2 );
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   b.SaveRequired();
   Print (a.getSaveRequired());
   Print (b.getSaveRequired());
//---
   return ( INIT_SUCCEEDED );
  }

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) CStrategy::CStrategy (int) 저장 = 0

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) CStrategy::CStrategy(int) 저장 = 0

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) 4

2019.09.14 16:07:26.856 Builder_v1.00 (EURUSD,H1) 하나

지금까지 작동한 모든 것:

1. 인터페이스를 선언하지 않음 - 전혀 문제가 되지 않았습니다.

2. 많은 setter와 getter를 생성하지만 정적 변수에서 벗어날 수 없습니다.


다시 시도하고 다음과 같이 코드를 다시 작성했습니다.

 //+------------------------------------------------------------------+
class CStrategy
{
private :
   int f_save_required;
protected :
   int set;
   void               SaveRequiredFlags ( const bool flag)                      { f_save_required++;  }
   int                SaveRequiredFlags ( void ) const                            { return (f_save_required); }
public :
virtual    void         SaveRequired ( void )                                      { SaveRequiredFlags( true );                         }
virtual    int          getSaveRequired ( void ) const                              { return (SaveRequiredFlags());                     }
                     CStrategy():f_save_required( 0 )                           {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                     CStrategy( int setting):set(setting),f_save_required( 0 )   {   Print ( __FUNCSIG__ , "save = " ,f_save_required);  }
                    ~CStrategy(){}

};
//+------------------------------------------------------------------+
class A: public CStrategy
{
public :
                     A( int st_setting) : CStrategy(st_setting){}
                    ~A(){}
};
//+------------------------------------------------------------------+
class B: public CStrategy
{
public :
                     B( int st_setting) : CStrategy(st_setting){}
                    ~B(){}
};
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   CStrategy *a = new A( 1 );
   CStrategy *b = new B( 2 );
   
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   a.SaveRequired();
   b.SaveRequired();
   Print (a.getSaveRequired());
   Print (b.getSaveRequired());
//---
   return ( INIT_SUCCEEDED );
  }

결과는 첫 번째 옵션에서와 같이 일대일입니다. 유일한 것은 인터페이스를 확실히 떠났다는 것입니다.

 
얻는 목표는 무엇입니까?
 
Dmitry Fedoseev :
얻는 목표는 무엇입니까?

모든 것이 작동하지만 목표는 지식을 얻는 것입니다))))

내가 한 방법 :

- 모든 계산이 저장되고 차량 설정을 저장하는 기본 클래스가 있습니다. 우리는 자신의 차량에서 작동하는 자손을 상속합니다.

- 열린 파일 의 핸들을 모든 자손에게 전달하여 하나의 파일에 저장하는 것이 편리하다고 생각합니다. 이 경우 save() 메서드는 다시 기본 클래스에 있습니다.

- 이벤트/플래그가 발생했을 때 기록하는 것이 좋습니다. - 자손 중 어느 것이 언제 시작되는지 알 수 없지만 무언가를 찾는 것보다 새 파일에 수십 개의 구조를 작성하는 것이 더 빠릅니다.

- 왜 하나의 클래스와 설정의 배열을 만들지 않습니까? - 가상으로 선언하기 위해 1~2개의 메소드가 필요하며, 각 차량에 추가합니다.

- 문제: 내가 모르는 제다이 OOP 트릭이 있기를 바라는 마음으로 정적 변수에서 벗어나려고 합니다.





추신: const 수정자는 좋은 것입니다. 보낸 시간을 후회하지 않습니다. 유용합니다. 토론한 사람들에게 다시 한 번 감사드립니다!

 

이 클래스의 모든 개체에서 한 번 열리는 파일에 데이터를 써야 하는 경우 정적 변수 없이는 방법이 없습니다. 그리고이 문제를 해결하는 데 가장 적합하다면 왜 제거합니까? 물론 전역 변수를 선언할 수도 있습니다.

이제 각 개체가 파일을 열면 쓰고 닫습니다. 그러면 각각의 객체에 파일명만 있으면 충분하겠지만.. 하지만 이 경우에도 변수의 값은 언제 어디서나 같기 때문에 정적 변수를 사용하는 것이 좋습니다.

아니면 못받았어요)

 
Dmitry Fedoseev :

이 클래스의 모든 개체에서 한 번 열리는 파일에 데이터를 써야 하는 경우 정적 변수 없이는 방법이 없습니다. 그리고이 문제를 해결하는 데 가장 적합하다면 왜 제거합니까? 물론 전역 변수를 선언할 수도 있습니다.

이제 각 개체가 파일을 열면 쓰고 닫습니다. 그러면 각각의 객체에 파일명만 있으면 충분하겠지만.. 하지만 이 경우에도 변수의 값은 언제 어디서나 같기 때문에 정적 변수를 사용하는 것이 좋습니다.

아니면 못받았어요)

한 번 열리는 파일에서 데이터를 쓰고 즉시 닫습니다. 터미널이 중단되면 데이터가 손실되지 않도록 1분에서 1시간에 한 번 기록합니다. 열린 파일을 그렇게 오랫동안 유지하는 것은 의미가 없습니다. 시각

이제 다음과 같이 코드를 작성해 보겠습니다.

 // это один файл, его не трогаю, тут только конструктор и 3 метода из интерфейсов, чтобы дать стратегиям тик, чтобы закрыть их и вот чтобы записать все ТС в файл

//____________________________________________________________________
void EA:: OnTick ( double &profit[])
{
       for ( int i = 0 ; i < StrategyCount; i++) profit[i] = Strategy[i].Strategy();   // запустили зоопарк стратегий и тут нам интересно дать им волю и узнать их профит, если ТС завершилась       
                                                                                   // она самостоятельно запустит "пустую стратегию", но профит будет возвращать первоначальный
       if (CStrategy::GetSaveRequired()) Save();                                     // вот тут узнаем состояние флага требуется ли запись состояния любой из ТС
}
//____________________________________________________________________
//это структура которая умеет открыть и записать файл, пример от fxsaber
struct FILE
{   const int handle;

  FILE( const string FileName, const int Flags ) : handle(:: FileOpen (FileName, Flags)) {}
 ~FILE( void ) { if ( this .handle != INVALID_HANDLE ) :: FileClose ( this .handle);   Print ( __FUNCTION__ );} 
};

//____________________________________________________________________
// метод для записи в файл состояния всех ТС, но проще записать все ТС один раз в файл, чем искать одну ТС..... в общем считаем, что скорость доступа к диску намного меньше чем работа с памятью
// используем структуру FILE - ну это просто удобно, объявили и забыли, она сама закроет файл когда уйдет из области видимости
void   EA::Save( void )
{  FILE f(DEF_PREFIX_FILE_NAME + IntegerToString (m_magic)+ ".bin" , FILE_WRITE | FILE_BIN );
   for ( int i = 0 ; i < StrategyCount; i++)
      Strategy[i].SaveSelfStatus(f.handle); 

}





// это основной файл (инклудник) в котором работаю, тут ТС 

//____________________________________________________________________
здесь опять все кратко и лаконично, но сделаю вывод в лог ошибки если возникнут при записи, сделаю именно здесь, т.к. только тут все модификации 
void CStrategy::SaveSelfStatus( const int handle)
{   FileWriteStruct (handle,m_setting);
   FileWriteStruct (handle,m_order_info);

}

 
Dmitry Fedoseev :

아니면 내가 이해하지 못했다

제가 이해한게 하나도 없는거 같은데 저번달에 '대각선으로'라는 글을 읽고 이번달에 다시 돌려봤는데 편법성 확인을 위해 테스트를 해봐야겠네요

Habr: 싱글톤(싱글톤) 또는 정적 클래스?

Singleton (Одиночка) или статический класс?
Singleton (Одиночка) или статический класс?
  • habr.com
Статья будет полезна в первую очередь разработчикам, которые теряются на собеседованиях когда слышат вопрос «Назовите основные отличия синглтона от статического класса, и когда следует использовать один, а когда другой?». И безусловно будет полезна для тех разработчиков, которые при слове «паттерн» впадают в уныние или просят прекратить...
 
Igor Makanu :

- 문제: 내가 모르는 제다이 OOP 트릭이 있기를 바라는 마음으로 정적 변수에서 벗어나려고 합니다.

이것이 왜 문제입니까? 필요한 경우 정적 변수 에서 멀리 이동할 필요가 없습니다.

나는 여전히 녹음의 필요성 플래그가 무엇에 의존하는지 이해하지 못합니다.

내 예에서는 변경 사항이 있으면 설정됩니다.

그리고 어떻게 필요합니까?

 
Koldun Zloy :

이것이 왜 문제입니까? 필요한 경우 정적 변수 에서 멀리 이동할 필요가 없습니다.

그러면 문제가 해결됩니다! - 처음에 모든 것을 했다

추신: 저는 이미 정적 구조로 실험을 시작했습니다... 초기화 문제만 보고 코드 가독성을 위해 flag.saveRequired 옵션을 시도한 다음 flagsave.Required 옵션을 시도했습니다. 그런 다음 이미 = 연산자를 오버로드하는 데 어려움을 겪었습니다. 일반적으로 이 모든 것은 넌센스입니다. 결과적으로 개인 정적 변수를 통해 코드를 만들고 setter와 getter를 추가하면 코드가 훨씬 간단하고 읽기 쉽습니다. 하지만 그들이 말하듯이: 우리는 쉬운 방법을 찾고 있지 않습니다 .... 최선 이해할 수없는 비디오의 저자에게 ...

 
Fast235 :

Volchansky가 여기에서 충분하지 않은 이유는 이제 이상하지 않습니다. 내부자 미리보기 또는 그가 사용하는 모든 것))

3개월 전에 오프사이트에서 win 10home을 다운로드했는데 기본 설정을 할 시간조차 없었습니다. 시작 아이콘 설정이 열리지 않습니다. 네 ***********

바쁘고 포럼에 많은 시간이 걸립니다.   Insider Preview 를 설치하지 않는 것이 좋습니다. 이제 Winda는 일주일에 한 번 새 빌드를 설치합니다. MS 웹사이트에서 안정적인 빌드를 다운로드하는 것이 좋습니다. 한곳에서 놀고 있는 나의 유치한 호기심 :)