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

 
Alexey Navoykov :
이것은 단지 테스트 클래스입니까 아니면 실제로 사용하시겠습니까?
후자라면 하지 말아야 합니다. 내가 기억하는 한 정적 변수 는 문자 변경 시 다시 초기화되지 않습니다.
그리고 일반적으로 초기화 시 사용할 수 있다는 사실이 아닌 일부 외부 값으로 상수 정적을 초기화하는 것은 좋은 생각이 아닙니다.

둘째 , 나는 여전히 MT4에서 씁니다. 여러 기호에 대한 테스터에서 작동하지 않습니다. MT4에서 유용한 것을 본 다음 MT4Orders의 도움으로 MT5로 전환합니다. 내 "창의력"이 확인되었습니다. 이 라이브러리에 문제 없이

첫째 , 나는 올바른 OOP의 아이디어를 보고 싶습니다. 그래서 무슨 일이 일어나는지 테스트하고 있습니다. 모든 것이 꽤 치질입니다. .... 보자, 시간이 있으므로 하기로 결정했습니다. 나 자신을 위한 운동))))


메인 코드가 시작되기 전에 초기화하는 것이 가장 좋은 방법이 아니라는 것을 알고 있습니다. 또는 오히려 이전에 그렇게 생각했지만 확인하지 않은 빌드가 몇 개인지, 새 빌드가 몇 개 있었는지, - MQL에서는 모든 것이 다음 위치에서도 항상 사용 가능합니다. 글로벌 가시성 수준에서 사람들이 코드 맨 위에서 증기 목욕을 하지 않고 다음과 같이 작성하지 않는 소스 코드를 보았습니다.

 #property strict
int     dig = _Digits ;
double point = _Point ;
double startbalance = AccountBalance();

이러한 잘못된 초기화는 빌드에서 빌드까지 수년 동안 작동합니다. 일반적으로 개발자는 가장 많은 것을 망쳤습니다. 대부분의 사람들))))




추신: 여기에서 일반적으로 OOP를 사용할 때 항상 그렇듯이 주요 작업은 OOP를 구성 요소로 올바르게 분할하고 현재 있는 모든 것에서 상속하지 않는 것입니다. 이제 텍스트 오류 출력을 "넣을" 위치를 모르겠습니다. 모든 클래스와 프로그램의 모든 곳에서 필요합니다. @Vladimir Simakov 가 위의 코드에서 보여준 것처럼 기본 클래스를 만들어야 할 가능성이 큽니다.

 
Igor Makanu :

pp 1-3 모든 것이 해결되었습니다. 하지만 .. 좋습니다. 통계에 도움이 되었습니다. 따라서 인증서가 있기 때문에 최소한 결정을 정당화할 수 있습니다. 이제 코드는 다음과 같습니다.

로그에 수신된 3개의 Cdeal 인스턴스 생성:

...

지금까지 모든 것이 의도한 대로 작동하고 있습니다!

작동하더라도 그렇게 하는 것은 안전하지 않습니다. 함수의 구현이 클래스 외부로 이동되기 때문에 클래스 자체에서 필드의 순서를 제어하기가 어려워집니다. 그런 다음 이러한 필드를 교환할 수 없다는 굵은 주석을 클래스에 최소한 작성해야 합니다. 그러나 여전히 원래 버전이 더 좋았습니다. 한 줄의 코드를 저장하기 위해 안정성을 희생하지 마십시오)
 
Alexey Navoykov :
하지만 원래 버전이 더 좋았습니다. 한 줄의 코드를 저장하기 위해 안정성을 희생하지 마십시오)

어느 것? - 여기 내 옵션에서 주제의 바닥이 있습니다)))

그리고 네, 당신은 절대적으로 옳습니다!

추신:

가장 간단한 경우이며 가장 신뢰할 수 있습니다. OnInit()에서 new를 통해 클래스의 인스턴스를 만들고 즉시 터미널의 모든 환경 변수를 복사했지만 이것이 최선의 옵션은 아닙니다. 이 예에서 내가 생성자를 시작할 때 즉시 주문을 열 계획입니다. 그러면 이 클래스 인스턴스가 삭제된 다음 다시 생성될 수 있습니다. 여기에서 반복 호출로 인해 이미 비효율에 빠지게 됩니다. 다시 로드를 시작합니다. 터미널 환경, 다시 메모리 소모 .... 일반적으로 이것은 이러한 방식으로 해결할 수 없습니다.


ZYZY: 다른 날 실험을 해보고 결국 @Vladimir Simakov의 예를 기초로 삼겠습니다. 모든 것이 매우 명확합니다.

 
Igor Makanu :

여기에 상수 값으로 필드를 한 번 초기화해야 하는 클래스를 스케치했는데 모든 것이 의도한 대로 작동하는 것 같습니다.

나는 2가지를 좋아하지 않는다:

1. SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) 호출을 반복합니다 . 초기화 순서가 지정되지 않았기 때문입니다. VolumeSTEP을 먼저 초기화한 다음 GetDigitsInVolumeStep() 이 호출된다는 사실이 아닙니다.

2. static int GetDigitsInVolumeStep() 메서드 사용 없애고 싶습니다 - YouTube에서 순수 OOP에서 정적 메서드를 사용하는 것이 좋지 않은 동영상을 충분히 보았으므로 풍차와 싸우고 있습니다.

비디오에 대한 링크는 본질적으로 동일한 https://youtu.be/lfdAwl3-X_chttps://youtu.be/zME4SOCHT0I 입니다.


내가 다르게 좋아하지 않는 이 2가지 점을 어떻게 다시 작성합니까?

1. 이 함수를 이중으로 호출하는 것은 문제가 없습니다.

2. 정적 함수 사용에 반대하는 사람들이 조금도 논평을 하지 않는 것이 귀찮지 않습니까?

누군가의 비디오를 보지 말고 책을 읽는 것이 좋습니다.

 
Koldun Zloy :

2. 정적 함수 사용에 반대하는 사람들이 조금도 논평을 하지 않는 것이 귀찮지 않습니까?

그리고 영상이 연습과 전혀 어울리지 않는다는 저를 처음으로 지지해주신 분, 제가 다른 주제로 영상에 대한 제 의견을 적었습니다 - 화자는 학생들의 질문에도 답하지 못했습니다

 
Igor Makanu :

그리고 영상이 연습과 전혀 어울리지 않는다는 저를 처음으로 지지해주신 분입니다. 영상에 대한 제 의견을 다른 주제로 썼습니다. 화자는 학생들의 질문에도 대답하지 못했습니다.

나는 OOP가 모든 사람이 자신의 방식으로 휩쓸고 있는 일부 인터넷 헤럴드의 불합리한 가정을 맹목적으로 따르기 위해 자신의 능력을 축소하는 것이라고 생각하지 않습니다.

 
Artyom Trishkin :

나는 OOP가 모든 사람이 자신의 방식으로 휩쓸고 있는 일부 인터넷 헤럴드의 불합리한 가정을 맹목적으로 따르기 위해 자신의 능력을 축소하는 것이라고 생각하지 않습니다.

영상을 봤다면 목표가 ....라는 것을 이해해야 합니다. 글쎄요, 일반적으로 당신도 아무것도 이해하지 못하고 아직 성장하지 않았습니다. 적어도 A100은 그렇게 설명했습니다.

추신: 조금 후에 인터페이스로 약간의 실험을 할 것입니다. 아마도 "아름다움의 본질"이 나타날 것입니다)))))

 

다음과 같이 작성하기 위해 정적에 대한 그의 비디오를 보았습니다.

 new Type0( new Type1( new Type2(...))); 

글쎄, 정적 위에 래퍼를 작성하는 것이 문제입니까?

 class Stateless_with_state {
        Stateless q;
        Data d;
        call() {q::call(d);}
};

그리고 템플릿을 통해 분명히 더 효율적입니다. 청중의 질문이 마음에 들었습니다 https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s

 
Igor Makanu :

추신: 조금 후에 인터페이스로 약간의 실험을 할 것입니다. 아마도 "아름다움의 정수"가 나타날 것입니다)))))

"OOP 패턴 - 행동 패턴 - 전략"이 작동하는지 확인했습니다.

 interface IStrategy
  {
   void Algorithm();
  };
//+------------------------------------------------------------------+
class Strategy_1 : public IStrategy
  {
public :
                     Strategy_1()   { Print ( __FUNCTION__ );}
   void               Algorithm()    { Print ( __FUNCTION__ );}
  };
//+------------------------------------------------------------------+
class Strategy_2 : public IStrategy
  {
public :
                     Strategy_2()   { Print ( __FUNCTION__ );}
   void               Algorithm()    { Print ( __FUNCTION__ );}
  };
//+------------------------------------------------------------------+
class Context
  {
private :
   IStrategy         *s;
public :
                     Context(IStrategy &_strategy) { Print ( __FUNCTION__ ); s = GetPointer (_strategy); s.Algorithm();}
                    ~Context() { delete s;}
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   Context c1( new Strategy_1);
   Context c2( new Strategy_2);
  }
//+------------------------------------------------------------------+

2019.08.31 21:04:40.441 tst (EURUSD,H1) 전략_1::전략_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) 컨텍스트::컨텍스트

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::알고리즘

2019.08.31 21:04:40.442 tst (EURUSD,H1) 전략_2::전략_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) 컨텍스트::컨텍스트

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::알고리즘


나를 위해 문제없이 작동

 
Igor Makanu :

"OOP 패턴 - 행동 패턴 - 전략"이 작동하는지 확인했습니다.

2019.08.31 21:04:40.441 tst (EURUSD,H1) 전략_1::전략_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) 컨텍스트::컨텍스트

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::알고리즘

2019.08.31 21:04:40.442 tst (EURUSD,H1) 전략_2::전략_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) 컨텍스트::컨텍스트

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::알고리즘


나를 위해 문제없이 작동

Context(IStrategy* _strategy):s(_strategy){ Print ( __FUNCTION__ ); s.Algorithm();}

1. new 연산자 는 포인터를 반환합니다. 물론 개발자가 암시적 역참조로 마음을 정했으므로 버전이 작동하지만 문서화되지 않은 작업에는 관여하지 않는 것이 좋습니다.

2. 물론 우리는 C ++를 가지고 있지 않지만 매우 유사하므로 초기화 목록(효율성에 대해서는 잘 모르겠습니다)이 정결합니다.