OOP(객체 지향 프로그래밍)에 대한 질문 - 페이지 6

 
C-4 :
포인터는 동적 유형 식별이 필요한 복잡한 개체 변환에 필수적입니다.

바실리, 예를 들어주세요!

메모리를 할당하고 포인터가 필요한 경우를 한 번만 알고 있습니다.

나는 당신이 거의 항상 그것 없이 할 수 있다고 확신합니다. 수동 메모리 관리를 사용하지 않는 것이 좋습니다. 이러한 문제가 이미 해결된 표준 라이브러리 는 항상 있습니다.

 
Integer :


어디에나 하나의 원칙이 있습니다. 모든 것이 가능한 한 간단하게 이루어져야 합니다. 야생에 있기 위해 야생에 올라갈 필요가 없습니다. 문제를 간단하게 해결할 수 있다면 간단하게 해결해야 합니다.


정확히. 그리고 여기서 클래스를 올바르게 디자인하는 것이 중요합니다. 그리고 이를 위해서는 다음 클래스(상속자)가 무엇인지 예측하는 것이 중요합니다.

일반적으로 기본 클래스는 최소한의 기능을 가져야 하지만 클래스 사용 벡터를 설정하는 가상 메서드를 많이 만드는 것이 바람직합니다.

MQL의 경우(아마도 그 반대일 수 있음) VOLDEMAR 'a와 같은 기본 클래스에 더 많은 기능이 있습니다. 그러나 광신 없이.


거래 기호 속성(POINT, STOPLEVEL 등. MarketInfo () 용 MODE_ХХХ)이 있습니다. 예를 들어 cSymbol 클래스로 밀어 넣는 것이 좋습니다.


주문 속성(오픈 가격, 유형, 로트 등. OrderXXX() )이 있습니다. 예를 들어 이들을 별도의 cOrder 클래스로 밀어 넣는 것이 좋습니다.

주문이 부분적으로 마감될 수 있다는 것을 기억하면 BaseLot 필드도 클래스로 설정하여 (로트의 어느 부분이 이미 마감되었는지 확인) 등도 설정할 것입니다.


(저를 위해) 일정 - 주문을 열고 닫을 수 있는 지정된 기간(일 기준), 막 닫는 기간(이미 손익분기점인 경우 트롤), 그리고 전혀 일하지 않는 기간이 있습니다. 그런 다음 열려 있는 모든 것을 닫고 열지 않은 것을 삭제합니다.

그들은 여전히 격차에 대해 기억하고 있으며 많은(전부는 아닐지라도) DC에서 거래의 마지막 시간에 거래 조건이 변경되고 많은 DC에서 매일 거래되는 금속에 휴식이 있다는 것을 기억합니까?


그리고 마지막으로 Expert Advisor가 있습니다. 특정 일정에 따라 특정 기호와 함께 작동하는 특정 알고리즘, "자체" 주문 목록 및 계산을 위한 자체 데이터가 있습니다.

cSymbol 클래스의 개체와 cOrder 클래스의 개체 배열이 있는 cExpert 클래스를 만들 수 있습니다. 이 기본 cExpert 에는 cOrder 개체의 속성을 업데이트하기 위한 기능, 주문 작업을 위한 기능, 오류 처리, 통계 등이 포함됩니다.

개인적으로 나는 %% of AccountFreeMargin() 에서 각 주문에 대해 고유한 마법을 생성(특정 주문에 대해 역주문을 하는 것이 더 쉽습니다), 역주문을 하는 기능 등을 계산하는 유용한 함수를 찾습니다.

그리고 이제 이 cExpert 에서 시장에서 무엇을 할 시기를 결정하는 고유한 추가 데이터 및 기능 세트(주문 열기/동반/닫기)를 사용하여 상속인을 만들 수 있습니다.

저것들. 거래 전략을 구현합니다. 그리고 우리가 "전략 고문 XXX"라고 부르는 사람이 되십시오.


그러나 모든 기본 기능은 cExpert 기본 클래스에 고정됩니다. 하위 클래스에는 이미 거래 전략 알고리즘이 포함되어 있습니다.

글쎄, 아마도 다른 누군가가 고급 오류 처리 또는 고급 거래 통계를 추가할 것입니다(소스가 없고 기본 cExpert에 푸시할 수 없는 경우).

Expert Advisors를 더 쉽게 작성할 수 있도록 클래스를 만드는 데 시간을 할애하고 있습니다. 사실, 그것은 고문 템플릿입니다. 구조적으로 완전하고 번지지 않습니다(필요한 모든 데이터가 코드와 함께 한 곳에 있음).


openorders()에 대한 래퍼 함수의 "초과"에 관해서는 개인적으로 그러한 래퍼를 지원합니다(특히 기본 함수에 대한 호출이 아니라 추가 기능이 있는 경우).

예를 들어, SLTP 가 래퍼 호출의 포인트에 지정되고 절대 숫자로 변환되어야 하고 주문 유형에 따라 더하기/빼기까지 필요한 경우(이 경우 이러한 변환은 operorders()에 채워질 수 있음).

개인적으로 매개변수의 정확성을 위해 매번 OrderSend() 매개변수를 구문 분석하는 것보다 BuyStop(...) 호출로 코드를 이해하고 BuyStop() 이 모든 것을 올바르게 수행하는지 확인하는 것이 더 쉽습니다.

추신: 많은 일이 있었습니다. 주말에. 예제 코드에 대해 Pavlickmql5 에게 감사드립니다.

이러한 예를 연구하고 생각하십시오. MQL로 작성된 프로그래밍 작업 분야에서 클래스 계층 구조를 차단할 필요가 있습니까?

기본(이 모든 "삼각형", "사각형" 등)을 기반으로 하는 전체 클래스 패밀리가 정말로 필요합니까?

그리고 다시 한 번 Integer 'a: 야생에 있기 위해 야생으로 올라갈 필요가 없습니다.

O. 내가 눈치채지 못했거나 최근 에 예제가 있는 문서 섹션이 나타났습니다.

 
Zhunko :

메모리를 할당하고 포인터가 필요한 경우를 한 번만 알고 있습니다.

나는 당신이 거의 항상 그것 없이 할 수 있다고 확신합니다. 수동 메모리 관리를 사용하지 않는 것이 좋습니다. 이러한 문제가 이미 해결된 표준 라이브러리는 항상 있습니다.


여기에서 분명히 이것이 우리가 말하는 것입니다.


cFather 클래스가 있고 3을 반환하는 int GetData() 메서드가 있다고 가정해 보겠습니다. GetData() 에서 가져온 내용을 표시하는 PrintData() 메서드도 있습니다.

이제 5를 반환하는 GetData() 를 재정의하는 cChild 자손이 있습니다.

cFather TestObject 유형의 객체를 선언하면 TestObject.GetData() 는 항상 3을 반환합니다.

cFather* TestObject=new cChild1 을 선언하면 TestObject.GetData() 는 cFather로 표시되더라도 5를 반환합니다.

지금 작성된 코드가 cFather 클래스(후계자 클래스)가 아직 존재하지 않는 경우에도 모든 cFather 클래스의 후계자에서 GetData() 메서드를 호출할 수 있도록 해야 합니다.

저것들. 나중에 GetData() 가 7을 반환하는 cChild2 클래스가 나타나면 cFather* Test2=new cChild2 이후에 Test2.PrintData() 함수가 7을 출력하기 시작합니다.

cFather 클래스 개체 참조 매개변수를 예상하고 GetData() 와 함께 사용하는 함수가 있는 경우 cFather 의 모든 하위 항목에 대한 올바른 데이터를 가져옵니다.

메서드 바인딩은 new 가 호출될 때 발생합니다. 링크가 아니면 바인딩이 어렵습니다. 선언된 클래스의 메소드가 호출됩니다.

여기여기 를 참조하십시오

 
EverAlex :

여기에서 분명히 이것이 우리가 말하는 것입니다.

...

메모리와 포인터를 할당하지 않고 기본 및 파생 클래스 의 전체 체인에 있는 모든 메서드에 액세스할 수 있는 연산자 "::"가 있습니다.
 
C-4 :


당신의 수업은 90% 중복되었습니다. 두 가지 기능만 주요 작업 수행합니다. 팁 Sel, Buy SelStop 등을 사용하는 이유는 무엇입니까? 실제로는 모두 Openorders를 호출하기만 하면 됩니다. 또한 주문 유형은 보호되지 않음을 의미하는 int로 전달됩니다. int 대신 고유한 열거나 표준 ENUM_ORDER_TYPE을 사용하는 것이 좋습니다. 그리고 일반적으로 마법의 숫자 "1", "2" 등을 사용하지 않고 열거형만 사용하는 것이 좋습니다. 이렇게 하면 주문의 왼쪽 값이 함수로 전송되는 것을 방지할 수 있습니다. Openorders 함수 자체가 너무 큽니다. 거래를 위한 블록과 조건을 확인하는 블록의 두 가지로 구성되어 있음을 알 수 있다. 각각은 별도의 private 함수 형태여야 합니다.

나쁜 시작은 아니지만 아직 배울 것이 많습니다. tip 함수는 다음과 같이 다시 작성하는 것이 좋습니다.

메소드를 호출할 때 편리합니다. 어떤 주문을 했는지 시각적으로 볼 수 있습니다...

비교에 관해서는 double을 0과 비교하는 것이 권장되지 않는 이유를 자세히 설명하십시오.

 
C-4 :
포인터는 동적 유형 식별이 필요한 복잡한 개체 변환에 필수적입니다.

동적 유형 식별의 존재는 일반적으로 프로젝트의 목발 아키텍처를 나타냅니다.
 
클래스가 Expert Advisor(Class c;)의 전역 수준에서 선언되면 한 틱에서 변경된 클래스 내부 개체의 상태가 다음 틱이 도착할 때 저장됩니까?
 
EverAlex :

여기에서 분명히 이것이 우리가 말하는 것입니다.


cFather 클래스가 있고 3을 반환하는 int GetData() 메서드가 있다고 가정해 보겠습니다. GetData() 에서 가져온 내용을 표시하는 PrintData() 메서드도 있습니다.

이제 5를 반환하는 GetData() 를 재정의하는 cChild 자손이 있습니다.

cFather TestObject 유형의 객체를 선언하면 TestObject.GetData() 는 항상 3을 반환합니다.

cFather* TestObject=new cChild1 을 선언하면 TestObject.GetData() 는 cFather로 표시되더라도 5를 반환합니다.

지금 작성된 코드가 cFather 클래스(후계자 클래스)가 아직 존재하지 않는 경우에도 모든 cFather 클래스의 후계자에서 GetData() 메서드를 호출할 수 있도록 해야 합니다.

저것들. 나중에 GetData() 가 7을 반환하는 cChild2 클래스가 나타나면 cFather* Test2=new cChild2 이후에 Test2.PrintData() 함수가 7을 출력하기 시작합니다.

cFather 클래스 개체 참조 매개변수를 예상하고 GetData() 와 함께 사용하는 함수가 있는 경우 cFather 의 모든 하위 항목에 대한 올바른 데이터를 가져옵니다.

메서드 바인딩은 new 가 호출될 때 발생합니다. 링크가 아니면 바인딩이 어렵습니다. 선언된 클래스의 메소드가 호출됩니다.

여기여기 를 참조하십시오

 class cFather
{
public :
     int GetData() { return 3 ;}
};

class cChild : public cFather
{
public :
     int GetData() { return 5 ;}
};
    
int f(cFather *p) { return p->GetData();}
    
int main()
{
    cChild obj;
    f(&obj);                 // вернет 3
    obj.cFather::GetData(); // вернет 3
    
     return 0 ;
}
 
Pavlick :


아마도 헛된 예를 썼을 것입니다. MKL에서는 작동하지 않습니다.

cChild obj;
f(&obj);                 // вернет 3
obj.cFather::GetData(); // вернет 3

X는 포인터가 아니라 막대기 위의 웃음입니다.

추신: dll'yah로 작성하면 일반 언어를 배울 기회가 있습니다.

 
Pavlick :


아마도 헛된 예를 썼을 것입니다. MKL에서는 작동하지 않습니다.

X는 포인터가 아니라 막대기 위의 웃음입니다.

추신: dll'yah로 작성하면 일반 언어를 배울 기회가 있습니다.


 class cFather
  {
public :
   int GetData() { return 3 ;}
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cChild : public cFather
  {
public :
   int GetData() { return 5 ;}
  };

int f(cFather *p) { return p.GetData();}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnStart ()
  {
   cChild obj,*ptr= GetPointer (obj);
   f(ptr);                     // вернет 3
   ((cFather *)ptr).GetData(); // вернет 3

   return 0 ;
  }