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

 
Alexey Navoykov :
MQL이 어떤 언어인지는 별로 중요하지 않습니다. 가장 중요한 것은 이론상 동일한 C ++보다 높은 수준이어야 하고 그 위의 코드는 더 간단하고 간결해야 한다는 것입니다. 그러나 실제로는 그 반대입니다. MQL 코드는 훨씬 더 복잡하고 서투르다. 목발로 많은 일을 해야 합니다.
나에게 WinApi와 같은 느낌))))
 

누구든지 MQL로 이식하는 방법을 보여줄 수 있습니까?

https://en.wikipedia.org/wiki/Keeper(디자인 패턴)/비표준 C++ 패턴

정면으로 시도했는데 설명이 잘못되었습니다.

 //+------------------------------------------------------------------+
class Originator
{
public :
   int state;
   Originator() : state( 0 )    {                             }
   class Memento;
   Memento* getMemento();
   void setState( int s)       { state = s;                  }
   void dumpState()           { printf ( "State: %i" , state); }
   class Memento
   {
   public :
       class Originator;
       int state;
      Originator* org;
      Memento() : state( 0 )    {                             }
       void restoreState();
   };
};
//+------------------------------------------------------------------+
Originator::Memento* Originator::getMemento()
{
   Originator::Memento* m = new Originator::Memento();
//   m.org = this;
//   m.state = state;
//   m->org = this;
//   m->state = state;
   return m;
}
//+------------------------------------------------------------------+
void Originator::Memento::restoreState()
{
//   org->state = state;
}
//+------------------------------------------------------------------+
void OnStart ()
{

}
//+------------------------------------------------------------------+
 
Igor Makanu :

누구든지 MQL로 이식하는 방법을 보여줄 수 있습니까?

https://en.wikipedia.org/wiki/Keeper(디자인 패턴)/비표준 C++ 패턴

정면으로 시도했는데 설명에 문제가 있습니다.

내 버전:

 //+------------------------------------------------------------------+
class Originator
  {
public :
   int                state;
                     Originator() : state( 0 )    {                             }
   class              Memento;
   Memento*          getMemento();
   void               setState( int s)       { state = s;                  }
   void               dumpState()           { printf ( "State: %i" , state); }
   class Memento
     {
   public :
       //class          Originator;
       int             state;
      Originator*    org;
                     Memento() : state( 0 )    {                             }
       void            restoreState();
     };
  };
//+------------------------------------------------------------------+
Originator::Memento* Originator::getMemento()
  {
   Originator::Memento* m = new Originator::Memento();
   m.org = GetPointer ( this );
   m.state = state;
   return m;
  }
//+------------------------------------------------------------------+
void Originator::Memento::restoreState()
  {
   this .state = state;
  }
//+------------------------------------------------------------------+
void OnStart ()
  {
   Originator org_obj;
   Originator::Memento* ptr_mem_obj = org_obj.getMemento();
   delete ptr_mem_obj;
  }
//+------------------------------------------------------------------+
 
Denis Kirichenko :

내 버전:

엄청난! 좋은 예

고맙습니다!

 
Alexey Navoykov :
MQL이 어떤 언어인지는 별로 중요하지 않습니다. 가장 중요한 것은 이론상 동일한 C ++보다 높은 수준이어야 하고 그 위의 코드는 더 간단하고 간결해야 한다는 것입니다. 그러나 실제로는 그 반대입니다. MQL 코드는 훨씬 더 복잡하고 서투르다. 목발로 많은 일을 해야 합니다.

아니요, 이것은 짧은 일화입니다)) 아마도 당신은 인생의 전문 분야에 실수를 저질렀을 것입니다. 아마도 요리 대학에 갔어야 했습니까?

 
Alexey Navoykov :
MQL이 어떤 언어인지는 별로 중요하지 않습니다. 가장 중요한 것은 이론상 동일한 C ++보다 높은 수준이어야 하고 그 위의 코드는 더 간단하고 간결해야 한다는 것입니다. 그러나 실제로는 그 반대입니다. MQL 코드는 훨씬 더 복잡하고 서투르다. 목발로 많은 일을 해야 합니다.

여기서 주요 문제는 이식 자체가 아니라 이식조차 하지 않는 것이지만 그러한 아이디어를 얻을 수 있는 방법입니다.

 

다음은 취약한 정신을 가진 아이들이 STL을 공부한 결과입니다.

그리고 MQL - 제작자는 다른 사람과 마찬가지로 프로그래머 및 프로그래밍 작업의 실제 문제를 완벽하게 이해하고 있음을 완벽하게 보여주었습니다. 이것을 이해하지 못한다면 정말로 요리 대학을 고려해야합니까?

핵심이자 유일한 MQL의 주요 문제는 전략의 안정적인 실행을 보장하는 알고리즘에 대해 생각하는 것입니다. 언어 문제가 전혀 아닙니다. 어떤 언어도, 어떤 구문도 이것을 스스로 제공할 수 없습니다. 따라서 구문 수준에서의 해킹은 여전히 유치원 수준에 있음을 분명히 보여줍니다. 즉, 지속 가능한 알고리즘을 개발하는 단계에 접근하는 것은 고사하고 기초적인 코딩 방법을 아직 배우지 않았습니다. 그러나 그것을 위해 당신은 과시를 가지고 있습니다 ... 카트가있는 전체 카트.

 
Igor Makanu :

엄청난! 좋은 예

고맙습니다!

 class Originator
  {
   int                state;
public :
   class Memento;
   Originator() : state( 0 ){}
   Memento*          getMemento()      { return new Memento(& this );}
   void               setState( int s)   {state=s;}
   int                State()           { return state;}
   void               dumpState()       { printf ( "State: %i" , state);}
///////////////////////////////////////////////////////////
   class Memento{
       int             state;
      Originator*    org;
       public :
                        Memento(Originator* mOrg):state(mOrg.State()),org(mOrg){}
         void            restoreState() {org.setState(state);}
   };
///////////////////////////////////////////////////////////
  };

void OnStart ()
  {
   Originator org_obj;
   Originator::Memento* ptr_mem_obj = org_obj.getMemento();
   org_obj.setState( 6 );
   org_obj.dumpState();
   ptr_mem_obj.restoreState();
   org_obj.dumpState();
   delete ptr_mem_obj;
  }

그래서 맞는 것 같다.

 
Vladimir Simakov :

그래서 맞는 것 같다.

알겠습니다. 저장하겠습니다. 작동 원리를 테스트해야 했습니다. 아마도 이것이 제가 찾던 것입니다. 테스터와 상태를 저장할 수 있는 작업 EA용 코드 하나, 테스터에서는 반대로 , "추가 제스처"에 리소스를 낭비하지 마십시오. 이러한 패턴의 일부는 #ifdef -ami가 될 수 있습니다. ;)

 

물론 누군가가 필요하지 않는 한 단일 패턴:

 class Alone{
private :
   int state;        
   Alone():state( 0 ){}
public :
   static Alone* Get(){
       static Alone alone;
       return &alone;}
   int State() { return (state);}
   void State( int _state) {state=_state;}
};

void OnStart ()
  {
   Test( 123 );
   Alone* test=Alone::Get();
   Print (test.State());
  }
  
void Test( int x){
   Alone* test=Alone::Get();
   test.State(x);}

맥주부터 굿풀드까지)))

난 아마 늙어가고 있어