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

 
Dmitry Fedoseev :

예, 여기에 끊임없이 제기되고 명확한 답이 없는 또 다른 질문이 있습니다. 자신의 클래스를 상속해야 하는 경우 - 이를 상속하거나 클래스의 새로운 확장 버전을 작성하는 것이 더 좋습니다.

그것은 모두 당신이 결국 원하는 것에 대한 일반적인 비전에 달려 있습니다. IMHO

다른 곳에서 클래스를 사용할 계획이라면 상속 없이 완료해야 합니다.

내 예에서 CError 클래스는 GetLastError()를 가져오고 설명과 함께 인쇄하고 오류의 값(int)을 반환할 수 있습니다. 저는 어디에서나 사용할 계획입니다. 어쨌든 정적에서 언어를 정의하는 생성자만 있습니다. 변수 및 케이스 자체가 오류 텍스트를 반환합니다.

여기에 다소 유용한 방법이 있습니다. bool ServerDisable(); - 이것은 서버(멀티플랫폼 MT4/MT5 코드)의 가용성을 결정하는데, 아주 좋은 기능입니다. 코드의 다른 부분에서 어딘가에 필요한 것 같지만, 트레이딩을 할 때 계속 사용할 거라고 생각했습니다 작업 - 나는 그것을 COorder 클래스에 붙였습니다.

.....

그리고 만약 내가 그것을 어디에서 사용하기를 원한다면?.... 여기에서 환상을 위한 필드는 물론 더 많지만 결국 객체가 COrder로 가는 방법은 중요하지 않습니다. 다른 곳에서 사용할 수 있습니까?


IMHO는 일반적으로 모든 것이 복잡해 보이고 포함으로 서비스 기능 라이브러리를 연결하는 것이 더 쉽고 컴파일러 자체는 실행 파일에서 사용되지 않는 것을 포함하지 않습니다.

절차적 스타일에서 이 전체 클래스는 매우 컴팩트할 것입니다. 여기서는 정적 https://www.mql5.com/ru/forum/85652/page17#comment_12805083 에 주문 볼륨 상수를 저장할 수 있는 주문 시작 기능의 예를 보여주었습니다.

 
Dmitry Fedoseev :

그리고 특정 한도 내에서 유지하는 것이 근본적으로 중요합니까? 한계 내에서 유지하는 것이 중요하다면 함수를 작성할 수 있습니다.

수업을 안 하면 불편한 호서명으로 귀찮게 해야 한다는 메시지의 맥락에서 답했습니다. 귀찮게 할 필요가 없다는 것을 보여주었습니다.

 
Alexey Navoykov :
심볼의 이름을 생성자에 전달하여 클래스를 유연하고 보편적으로 만드는 것을 방지하는 것은 무엇입니까? 포트폴리오 트레이딩의 가능성을 근본적으로 고려하고 있습니까?

나는 모든 것을 고려한다

하지만 지금은 연구에 매진하고 있습니다. 이제 MM을 연구하는 1000 및 1 방법과 주문 시스템을 사용한 모든 종류의 트릭이 거의 준비되었습니다)))

그러나 나는 여전히 그것이 결국 너무 유연하지 않다고 생각합니다. 나는 이미 절차적 스타일이 더 최적 + 주문 작업의 디버깅된 기능을 "트위치"시키는 작은 클래스라고 위에서 2번 썼습니다.

일반적으로 아이디어 테스트로 전환하는 동안 코드를 자주 수정하고 건드리지 않는 부분이 분명합니다.

 
Igor Makanu :

.....

그리고 만약 내가 그것을 어디에서 사용하도록 하고 싶다면?.... 여기에서 상상의 영역은 확실히 더 크지만, 결국 객체가 COrder로 가는 방법은 중요하지 않습니다. 다른 곳에서 사용할 수 있습니까?


후행은 메인 로직과 아무 관련이 없기 때문에 분리됩니다. 그들은 존재할 수도 있고 없을 수도 있습니다.

***

후행 및 기타 유사한 유지 관리 기능을 한 클래스의 자손으로 만들고 해당 인스턴스를 배열로 만드는 것이 좋습니다. 기능이 활성화되면 인스턴스가 배열에 추가되고 실행됩니다. 모든 기능이 비활성화되면 배열이 비어 있고 불필요한 if가 실행되지 않습니다. Expert Advisor에 최소 100개의 후행을 삽입할 수 있으며 이는 작업 속도에 영향을 미치지 않습니다.

 
Alexey Navoykov :
그렇게 하는 것이 아닙니다. 최소한 Bid()와 Ask()를 모두 호출해야 합니다. 값이 변경되지 않은 것처럼 보이기 때문에 실제로는 그렇지 않습니다.

아아, 이것은 항상 수행되었습니다. Bid 및 Ask는 MT4에 남아 있었고 현재 가격의 이 간단한 사용 및 수신을 파괴하려는 Creator의 변덕은 없습니다.)

fxsaber :

나는 문제가 발생하지 않은 다음과 같은 계획을 가지고 있습니다.

  1. 테스터용으로만 TS를 작성합니다. 로그, 오류 처리기 및 기타 찌꺼기가 없습니다. 코드는 OOP를 통해 수행되는 경우(기본적으로는 아님) 매우 간결하고 이해하기 쉬우며 편집하기 쉬운 것으로 판명되었습니다. KB에 예제를 게시했습니다. 보너스 - 빠른 최적화 .
  2. 가장 중요한 것은 테스터의 경우 독립 블록에 분산되어 있다는 것입니다. 거래 신호 형성 - 하나의 블록. 신호 거래는 다릅니다.
  3. 실제로의 번역은 항상 같은 움직임의 여러 가지로 이루어집니다. 코드를 편집하지 않은 차량은 가상 환경에 배치됩니다. 한 환경에 여러 TS를 동시에 가질 수도 있고, 각각의 TS를 자체적으로 가질 수도 있으므로 OOP가 특히 편리합니다. 다음으로, 가상 머신에서 실제 머신으로 트랜잭션/주문을 단순히 복사하는 복사기를 가져옵니다(시장에 많은 것이 있으므로 사람들이 복사기 로직에 손을 댔습니다).
  4. 이 체계를 사용하면 TS를 작성하는 것이 빠르고 이해하기 쉬운 작업입니다. 실제 번역(사실 이것은 드문 일)은 항상 균일하고 빠르고 명확하게 수행됩니다.

이 코드를 말씀하시는 건가요? https://www.mql5.com/ru/code/22770

구현이 마음에 들었습니다. 테스터와 옵티마이저를 위해, 나는 아마 그것을 기초로 삼을 것입니다. 코드는 짧고 읽기 쉽습니다. 솔직히 말해서, 내가 당신의 코드를 가져와 읽었다는 것에 놀랐습니다. 당신은 훨씬 더 세련된 작문 스타일을 가지고 있습니다. 보통 바보같이 연결해서 사용하는데 논리적으로 이해가 안되는거 알아

 
Igor Makanu :

아아, 이것은 항상 수행되었습니다. Bid 및 Ask는 MT4에 남아 있었고 현재 가격의 이 간단한 사용 및 수신을 파괴하려는 Creator의 변덕은 없습니다.)

따라서 결국 해당 값은 현재 이벤트 처리 내에서 변경되지 않습니다(물론 RefreshRates를 강제로 호출하지 않는 한). 저것들. 그것들은 함수가 아니라 변수입니다. 그리고 당신의 기능은 변수처럼 보입니다.

 

FP에게 수백 메가바이트 또는 기가바이트의 데이터 배열을 관리하고 처리하는 실제 작업을 부여하면 전체 멋진 메시지 모델(데이터는 변경할 수 없음)이 낭비됩니다.

이들은 시간의 실제 문제에서 탈출하여 가상의 우주에서 방송한 이론가입니다. 통신에 대한 이야기는 가장 멍청한 데이터 전달입니다.

사실, 복잡성을 처리하는 유일한 방법은 객체로 압축하는 것입니다.
 
Alexey Navoykov :

따라서 결국 해당 값은 현재 이벤트 처리 내에서 변경되지 않습니다(물론 RefreshRates를 강제로 호출하지 않는 한). 저것들. 그것들은 함수가 아니라 변수입니다. 그리고 당신의 기능은 변수처럼 보입니다.

나는 당신의 예에서 우리가 논의하고 있는 문제를 어떻게 설명해야 할지 모르겠습니다. 나는 순전히 인간적으로 노력할 것입니다. 첫 번째 PC를 가진 사람으로서 이것은 Pentium-90입니다. 편리한 사용을 위해 스택에 값 레지스터를 배치하고 .. 멀리 가자고 하는 추가 함수 호출이 추가됩니다.

나는 모든 것이 이제 프로세서 수준에서 반복적으로 캐시된다는 것을 알고 있으며 컴파일러 개발자가 "함수 호출에서 함수 호출"을 더 효율적으로 만들 것이라고 생각합니다.

그러면 귀하의 예는 다음과 같아야 합니다.

 #define Ask(dummy) SymbolInfoDouble ( _Symbol , SYMBOL_ASK )
#define Bid(dummy) SymbolInfoDouble ( _Symbol , SYMBOL_BID )

void OnStart ()
  {
   Print ( "Ask = " ,Ask());
   Print ( "Bid = " ,Bid());
  }

또는 다음과 같이:

 #define Ask(symbol_) SymbolInfoDouble (symbol_, SYMBOL_ASK )
#define Bid(symbol_) SymbolInfoDouble (symbol_, SYMBOL_BID )

void OnStart ()
  {
   Print ( "Ask = " ,Ask( _Symbol ));
   Print ( "Bid = " ,Bid( _Symbol ));
  }
 
Dmitry Fedoseev :

Vasily, 이 기사는 당신에게 매우 유용할 것입니다. 자신을 고문하지 않기 위해 OOP를 위해 자신의 OOP를 짜내십시오.

MT를 위한 기능적 프레임워크에 대한 아이디어가 있습니다. OOP는 거의 없을 것입니다. 기능, "모나드" 및 기타 유사 FP 기능만. 나는 모든 것을 따옴표로 씁니다. 왜냐하면 당연히 MQL에서는 본격적인 FP를 할 수 없다.

 
Dmitry Fedoseev :

댓글은 불필요합니다.

당신이 서로를 그다지 사랑하지 않거나 그 반대의 경우도 마찬가지입니다. 2 게이는 자신의 길을 찾고 있습니다)

그건 그렇고, 나는 당신의 기사를 좋아했습니다. Expert's는 Lokhov의, 약하지만 나는 그를 덜 좋아합니다.

그리고 저는 게이가 아닙니다.