English Русский 中文 Español Deutsch 日本語 Português Italiano
preview
MQL5 객체 지향 프로그래밍(OOP) 이해하기

MQL5 객체 지향 프로그래밍(OOP) 이해하기

MetaTrader 5트레이딩 |
46 6
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

이 글에서는 프로그래밍에서 가장 중요한 주제 중 하나인 코딩을 쉽고 원활하게 할 수 있는 방법을 공유하고 개발자 또는 프로그래머로서 '반복하지 않는 법'의 지름길인 'DRY'의 개념을 적용할 수 있도록 알아보도록 하겠습니다. 이외 소프트웨어의 보안을 강화할 뿐만 아니라 다른 기능도 강화할 수 있는 방법에 대해서도 알아볼 것입니다. 먼저 OOP(객체 지향 프로그래밍)에 대해 알아보고 몇 가지 애플리케이션을 살펴보면서 우리가 이 개념을 어떻게 사용하고 MQL5(MetaQuotes Language)에서 코딩에는 어떻게 활용할 수 있는지에 대해 알아보는 시간을 갖겠습니다.

이에 따라 우리는 다음 세 가지 사항을 통해 이 흥미롭고 중요한 주제를 다룰 것입니다:

이 글의 주요 목적은 객체 지향 프로그래밍(OOP)의 기본적인 내용과 이를 소프트웨어 제작에 어떻게 유용하게 사용할 수 있는지 이해하는 것입니다. 우리는 이 놀라운 접근 방식을 MQL5에 적용하여 보다 효과적이고 안전한 소프트웨어를 만드는 데 도움이 될 수 있는 방법이 무엇인지에 대해 배워볼 것입니다.

이 OOP 접근 방식에 대해 자세히 알아보는 것은 누구에게나 매우 유용할 것이며 특히 여기서 배우는 내용은 C++, Java, Python 등과 같은 다른 프로그래밍 언어에도 적용할 수 있습니다. 이 접근 방식에 대한 매우 중요하고 유익한 리소스는 많이 있습니다. MQL5 언어에서는 이 글에서 다루는 주제뿐만 아니라 모든 주제에 대해 중요한 리소스가 있는데 이는 바로 MQL5 문서인 MQL5 OOP 문서이며 여러분은 링크를 통해 OOP에 대한 주제를 확인할 수 있습니다.

면책: 여기의 모든 정보는 정보 제공의 목적으로만 '있는 그대로' 제공되며 거래의 목적이나 조언을 위해 준비된 것이 아닙니다. 여기의 정보는 어떤 종류의 결과도 보장하지 않습니다. 귀하가 귀하의 거래 계정에서 이들 자료를 사용하기로 결정한 경우 귀하는 이에 대한 위험을 감수해야 하며 이에 대한 책임은 귀하에게 있습니다.


OOP(Object-Oriented Programming)란 무엇인가요?

이 주제에서는 OOP의 기초에 대해 배우게 됩니다. 그러므로 먼저 OOP를 정의하는 이 흥미로운 주제부터 시작하겠습니다. OOP는 객체 지향 프로그래밍의 줄임말로 컴퓨터 프로그래밍의 패러다임입니다. 재사용 가능한 소프트웨어를 중복된 코드 작업 없이 쉽게 만들고 개발하는 데 도움을 주며, 우리가 DRY(Do not Repeat Yourself; 반복 작업 없이) 개념을 적용하는 데 도움이 됩니다.

앞으로 살펴볼 것처럼 OOP는 우리가 세상의 본질에 더 가까이 다가갈 수 있도록 도와줍니다. 우리 주변의 모든 것이 객체에 의해 만들어지고 각 객체는 고유한 특성과 동작을 가지고 있습니다. 그리고 이는 우리가 소프트웨어에서 데이터로 할 수 있는 일들도 마찬가지입니다. OOP에 대해 더 자세히 알아보려면 우리는 객체와 클래스에 대해 다루어야 하는데 객체는 클래스의 인스턴스를 의미하고 클래스는 객체에 대한 템플릿이라는 것을 알아야 합니다. 클래스인 템플릿 내부에서 우리는 이 객체의 동작에 대해 자세히 정의할 것입니다.

OOP의 기본 개념:

소프트웨어에서 OOP를 적용할 때는 다음과 같은 원칙이 적용됩니다.

  1. 캡슐화(Encapsulation)
  2. 추상화(Abstraction)
  3. 상속(Inheritance)
  4. 다형성(Polymorphism)

oop

1- 캡슐화:

캡슐화는 하나의 클래스에서 함수와 데이터를 연결할 수 있는 메서드를 말합니다. 클래스 내의 데이터와 함수는 클래스 내에서만 접근할 수 있는 비공개일 수도 있고 클래스 외부에서도 접근할 수 있는 공개일 수도 있습니다. 캡슐화 개념은 클래스 구현의 복잡성을 해결하고 개발자에게 데이터를 완전히 제어할 수 있는 권한을 부여하여 다른 값에 의존하는 모든 값을 충돌 없이 추적하는 데 도움이 됩니다.

따라서 캡슐화는 개발자에게 높은 수준의 제어 기능을 제공하고 소프트웨어 전체 코드에 영향을 주거나 변경하지 않고도 클래스 데이터를 더 원활하고 쉽게 테스트하고 처리하는 데 도움이 될 뿐만 아니라 시스템을 계속 가동하고 가능한 오류를 방지하는 데 도움이 된다고 할 수 있습니다. 캡슐화는 오류를 해결하고 복잡한 코딩을 방지하는 데에도 도움이 되는 것입니다.

다음 그림은 캡슐화의 개념을 나타냅니다:

캡슐화

2- 추상화:

추상화는 불필요한 세부 사항을 숨기고 꼭 필요한 세부 사항만 제시하는 메서드로 캡슐화의 개념보다 광범위하지만 모든 클래스의 구현 과정을 모두 알지 못하고 내가 구현해야 할 부분만 알면서도 데이터를 보호하고 함수를 구현한다는 점에서 목적성의 측면에서 캡슐화와 동일하다고 할 수 있습니다.

이를 위해 우리는 인터페이스와 구현이라는 두 가지 중요한 메서드를 포함해야 합니다. 인터페이스는 클래스가 서로 상호 작용하도록 하고 서로 처리할 수 있도록 하는 메서드를 말하며 구현은 코드의 모든 세부 사항이 있거나 혹은 클래스 세부 사항의 로직이 있는 메서드를 말합니다. 따라서 추상화는 소프트웨어의 보안을 높이고 코딩 프로세스를 반복하지 않게 하고 처음부터 다시 코딩하지 않게 하여 잘 만들어진 앱을 기반으로 더 많은 앱을 개발 및 코딩하는 데 도움이 됩니다.

3- 상속:

이름에서 알 수 있듯이 상속 개념은 이전 클래스에서 새 클래스를 파생하고 새 클래스가 이전 클래스의 기능을 상속하는 것으로 이 경우 이전 클래스를 부모 또는 슈퍼클래스라고 하고 새로 파생된 클래스를 자식 클래스라고 합니다. 이 개념은 DRY(반복하지 않기)의 개념을 적용하는 데 도움이 되며 재사용성이라는 주요 아이디어를 나오게 합니다.

상속

4- 다형성:

이 개념에서 단어를 두 부분으로 나누어 보면 (Poly)는 다수 또는 다중을 의미하고 (Morphism)은 형태를 의미합니다. 이렇게 다형성의 개념은 실체가 다수 또는 다중의 형태로 동작할 수 있도록 돕는다는 의미입니다. 예를 들어 우리가 (a) 변수와 (b) 변수의 합계를 구할 수 있는 합산 메서드를 가지고 있으면서 (a), (b), (c)와 같이 서로 다른 변수에 대해 합계를 구할 수 있는 또다른 메서드를 가지고 있을 수 있습니다.

간단히 말해 다형성이란 하나의 인터페이스와 여러 가지 다양한 메서드를 의미합니다.

앞서 살펴본 내용을 요약하면 OOP는 고유한 동작과 특성을 가질 수 있는 객체를 통해 소프트웨어의 디자인을 구성하는 데 중점을 둔 컴퓨터 프로그래밍 모델로 특히 소프트웨어가 많이 업데이트되고 조작되는 크고 복잡한 소프트웨어에서 유용한 메서드입니다.

OOP 속성 및 기능:

  • OOP 접근 방식을 적용하는 소프트웨어에는 클래스와 함수가 포함됩니다.
  • 캡슐화 및 추상화 원칙을 적용하여 데이터를 숨김으로써 높은 수준의 보안을 제공합니다.
  • 코드를 작은 코드 블록으로 나눌 수 있어 복잡한 프로젝트를 쉽게 작업할 수 있게 하고 프로젝트의 복잡성을 줄일 수 있습니다.
  • 업데이트 및 개발 프로세스가 더 쉬워집니다.
  • 상속 원칙을 적용하여 코드의 재사용성을 높입니다.
  • 충돌 없이 동일한 클래스의 인스턴스를 여러 개 생성할 수 있습니다.

OOP 접근 방식을 적용할 수 있는 프로그래밍 언어는 여러 가지가 있습니다. 가장 많이 사용되는 프로그래밍 언어는 C++, C#, Python, Java, JavaScript, PHP 등이 있습니다. 이러한 언어 중에서 OOP 접근 방식을 적용할 수 있는 언어가 바로 MQL5 언어입니다. 다음 주제를 통해 이에 대해 알아볼 것입니다.


MQL5의 OOP

이 주제에서는 MQL5의 OOP와 이를 사용하는 방법에 대해 알아봅니다. 객체에 대한 청사진과 같은 역할을 하는 클래스를 만들고 클래스 자체는 컬렉션이거나 함수처럼 변수와 메서드를 포함하지만 특정 작업 집합을 수행하기 위해 클래스에서 메서드라고 부르는 것이 OOP의 기본입니다. 여기서 클래스 내부의 변수와 메서드 또는 함수를 클래스 멤버라고 부른다는 점도 잊지 마시기 바랍니다. 여기서 우리가 알아야 할 것은 OOP는 품질과 보안 외에도 앞서 살펴본 대로 우리의 많은 노력을 절약하게 하며 작동하기 때문에 MQL5에서 OOP 개념을 적용할 수 있다는 것은 훌륭하고 감사한 것입니다.

MQL5에서 OOP 개념을 적용하려면 MQL5에서 다음을 어떻게 사용할 수 있는지 이해해야 합니다:

  • 클래스(Classes)
  • 액세스 수정자(Access Modifier)
  • 생성자 및 소멸자(Constructors and Destructors)
  • 파생(자식) 클래스(Derived (Child) Classes)
  • 가상 함수(Virtual Functions)
  • 객체

클래스:

MQL5에서는 객체의 청사진이 될 클래스를 생성해야 하는 경우 클래스는 함수의 경우와 마찬가지로 전역 범위에서 선언해야 합니다. 클래스 키워드 뒤에 원하는 고유 키워드를 사용하고 두 개의 중괄호 사이 또는 안에 클래스의 멤버인 변수와 메서드를 배치한 다음 두 번째 중괄호 뒤에 세미콜론을 배치하여 클래스 선언을 종료하면 이렇게 클래스가 생성되는 것입니다. 참고로 이 클래스 선언은 프로그램이나 인클루드(include) 파일에서 사용할 수 있습니다.

다음은 이 클래스 선언의 예시입니다:

class Cobject
{
   int var1;       // variable1
   double var2;    // variable1
   void method1(); // Method or function1
};

이전 예제에서 볼 수 있듯이 클래스의 멤버는 세 개이며 두 개의 변수와 하나의 메서드 또는 함수입니다.

액세스 수정자:

이러한 액세스 수정자를 통해 클래스 외부에서 사용할 수 있는 변수와 함수를 결정할 수 있습니다. 그리고 공개, 비공개, 보호의 세 가지 액세스 키워드가 있습니다.

  • 공개: 클래스 외부에서 사용할 수 있는 멤버를 나타냅니다.
  • 비공개: 클래스 외부에서는 사용할 수 없고 함수에서 클래스 내부에서만 사용할 수 있는 멤버를 나타냅니다. 이 클래스의 자식 클래스는 이러한 비공개 멤버를 상속하지 않습니다.
  • 보호: 하위 클래스에 의해 상속되지만 본질적으로 비공개인 멤버를 나타냅니다.

이에 대한 예시는 다음과 같습니다:

class Cobject
{
   private:
   int var1;       // variable1
   protected:
   double var2;    // variable1
   public:
   void method1(); // Method or function1
};

이전 예제에서 볼 수 있듯이 클래스에는 두 개의 변수가 있는 세 개의 멤버가 있는데 하나는 비공개이고 다른 하나는 보호되고 세 번째 멤버는 공개입니다.

생성자 및 소멸자:

클래스에서 변수를 초기화해야 하는 경우 생성자를 사용합니다. 생성자는 컴파일러에 의해 기본적으로 생성되지만 이 기본 생성자는 보이지 않습니다. 또한 접근성에 따라 공개되어야 합니다. 반면에 소멸자는 클래스 객체가 소멸될 때 자동으로 호출되는 함수입니다. 클래스 이름을 물결표(~)를 사용하여 호출할 수 있듯이 소멸자도 그렇게 호출할수 있습니다. 소멸자의 존재 여부와 관계없이 문자열, 동적 배열 및 객체는 초기화가 필요하므로 어쨌든 초기화됩니다.

다음은 생성자의 예시입니다:

class CPrices
  {
private:
   double               open;         // Open price
   double               high;         // High price
   double               low;          // Low price
   double               close;        // Close price
public:
   //--- Default constructor
                     CPrices(void);
   //--- Parametric constructor
                     CPrices(double o,double h,double l, double c);
  };

파생(자식) 클래스:

앞서 우리는 상속 개념은 슈퍼 클래스나 부모 클래스에서 자식 클래스를 만들 수 있고 이 자식 클래스는 비공개 멤버를 제외한 부모 클래스의 모든 멤버를 상속하기 때문에 OOP의 가장 가치 있고 유용한 기능 중 하나라는 것을 배웠습니다. 그런 다음 해당 하위 클래스에 새 변수와 함수를 추가할 수 있습니다.

예를 들어 다음 예제를 통해 가격에 대한 부모 클래스가 있는 경우 다음과 같이 일일 가격에 대한 자식 클래스를 만들 수 있습니다:

class CDailyPrices : public CPrices
{
public:
   double               open;          // Open price
   double               high;          // High price
   double               low;           // Low price
   double               close;         // Close price
};

보시다시피 부모 클래스 이름은 CPrices이고 CDailyPrices는 자식 또는 파생 클래스입니다. 이제 CPrices의 모든 공개 및 보호 멤버는 CDailyPrices 클래스의 일부이며 여전히 공개되어 있습니다.

가상 함수:

자식 클래스에서 일어나는 메서드나 함수의 작동 방식을 업데이트하려면 부모 클래스에서 (가상) 함수를 사용하여 자식 클래스에서 함수를 정의하면 됩니다. 예를 들어 클래스에 따라 서로 다른 두 가지 버전의 함수가 있는 경우입니다. 부모 클래스의 경우 가상 키워드를 사용하여 함수를 정의합니다.

class CVar
  {
public:
   virtual 
void varCal();
  };

그런 다음 하위 클래스에서 동일한 함수를 업데이트합니다.

class CVar1 : public CVar
{
public:
 int varCal(int x, int y);
}; 

객체:

객체는 변수를 만들 때와 마찬가지로 고유 식별자이며 객체 식별자 앞에 클래스 이름을 유형으로 사용합니다. 프로젝트에 필요한 만큼 클래스에 속한 많은 객체를 만들 수 있으며 모든 객체에 고유 식별자를 사용하기만 하면 됩니다. 객체를 선언한 후에는 점(.)을 사용하고 그렇게 우리는 모든 공용 멤버에 액세스할 수 있습니다.

이를 명확하게 이해하기 위해 거래 수(num_trades)라는 정수 변수가 있는 클래스를 생성하는 예제를 살펴봅시다.

class CSystrades
{
public:
int num_trades;
};

그런 다음 우리는 system1이라는 이 클래스에 속하는 객체를 만들어야 하는데 다음과 같은 방법으로 이를 수행합니다.

CSystrades system1;

그런 다음 이 객체를 다음과 같이 (3) 값으로 정의할 수 있습니다.

system1.num_trades=3;

이제 여러분 모두 MQL5에서 OOP 접근 방식을 어떻게 적용할 수 있는지 이해했을 것입니다.

OOP 애플리케이션

이 흥미로운 주제에서는 소프트웨어에 OOP 접근 방식을 적용하는 몇 가지 간단한 응용 프로그램을 제시하여 이를 어떻게 사용할 수 있는지 그리고 이것이 얼마나 유용할 수 있는지 잘 알아보도록 하겠습니다.

priceClass application:

이 간단한 응용 프로그램에서 우리는 여러 시간대의 가격을 확인할수 있어야 하며 이 예에서는 세 가지 시간대 (일일, 주간 및 월간)를 제시 할 것입니다. 여기에는 모든 가격 (시가, 고가, 저가, 종가)도 EA 탭에서 한 곳에서 볼수 있어야 있습니다. 그 후에는 이 간단한 예제에서 더 많은 것을 개발하여 더욱 고급의 소프트웨어를 구현할 수 있을 것입니다.

먼저 다음 단계를 통해 클래스를 선언해야 합니다:

  • 글로벌 범위에서 가격에 대한 클래스를 선언하고 클래스 키워드를 사용하여 모든 일반 멤버를 공개로 포함시켜야 합니다.
  • 공개 키워드를 사용합니다.
  • 다섯 가지 변수(기간, 시가, 고가, 저가, 종가)를 만듭니다.
  • 모든 가격 데이터를 출력하는 void 함수를 만듭니다.
class CPrices
  {
public:
   string            timeFrame;
   double            open;
   double            high;
   double            low;
   double            close;
   void              pricesPrint()
     {
      Print(timeFrame," Prices = Open: ",open," - ","High: ",high,"-","Low: ",low,"-","Close: ",close);
     }
  };

클래스에서 일별, 주별, 월별 가격의 객체를 생성합니다.

CPrices CDailyPrices;
CPrices CWeeklyPrices;
CPrices CMonthlyPrices;

OnInit 함수 내에서 세 가지 시간 프레임에 대해 다음을 정의합니다:

  • 문자열 시간 프레임 정의하기.
  • iOpen 기능을 사용하여 시가를 정의합니다.
  • iHigh 기능을 사용하여 고가를 정의합니다.
  • iLow 기능을 사용하여 저가를 정의합니다.
  • iClose 함수를 사용하여 종가를 정의합니다.
  • 출력 함수 또는 메서드 호출.
int OnInit()
  {
//--- Daily time frame
   CDailyPrices.timeFrame="Daily";
   CDailyPrices.open=(iOpen(Symbol(),PERIOD_D1,1));
   CDailyPrices.high=(iHigh(Symbol(),PERIOD_D1,1));
   CDailyPrices.low=(iLow(Symbol(),PERIOD_D1,1));
   CDailyPrices.close=(iClose(Symbol(),PERIOD_D1,1));
   CDailyPrices.pricesPrint();

//--- Weekly time frame
   CWeeklyPrices.timeFrame="Weekly";
   CWeeklyPrices.open=(iOpen(Symbol(),PERIOD_W1,1));
   CWeeklyPrices.high=(iHigh(Symbol(),PERIOD_W1,1));
   CWeeklyPrices.low=(iLow(Symbol(),PERIOD_W1,1));
   CWeeklyPrices.close=(iClose(Symbol(),PERIOD_W1,1));
   CWeeklyPrices.pricesPrint();

//--- Monthly time frame
   CMonthlyPrices.timeFrame="Monthly";
   CMonthlyPrices.open=(iOpen(Symbol(),PERIOD_MN1,1));
   CMonthlyPrices.high=(iHigh(Symbol(),PERIOD_MN1,1));
   CMonthlyPrices.low=(iLow(Symbol(),PERIOD_MN1,1));
   CMonthlyPrices.close=(iClose(Symbol(),PERIOD_MN1,1));
   CMonthlyPrices.pricesPrint();
   return(INIT_SUCCEEDED);
  }

그 후 도구 상자의 EA 탭에서 이 EA를 실행하면 출력된 가격을 다음과 같이 확인할 수 있습니다:

 가격 출력

이전 그림에서 볼 수 있듯이 세개의 줄이 출력되어 있습니다:

  • 첫 번째 줄에는 일일 시가, 고가, 저가, 종가의 일일 가격이 출력됩니다.
  • 두 번째는 동일한 가격을 출력하지만 주간 데이터에 속합니다.
  • 세 번째 줄도 동일하게 출력되지만 월별 데이터에 속합니다.

indicatorClass application:

OOP 방식을 사용하여 네 가지 이동 평균 유형(단순, 지수, 평활, 선형 가중 평균)의 값을 출력할 수 있는 소프트웨어를 만들어 보겠습니다. 이러한 유형의 소프트웨어를 만드는 간단한 단계는 다음과 같습니다:

클래스 키워드를 사용하여 지표 CiMA 클래스를 선언하고 이 클래스의 공용 멤버를 생성하여 이동 평균의 유형을 정의하는 MAType, 이동 평균의 배열을 정의하는 MAArray, 모든 유형의 핸들을 정의하는 MAHandle, 모든 이동 평균의 값을 정의하는 MAValue 이렇게 네 가지 공통 변수를 생성합니다. 모든 이동 평균 유형의 값을 출력하는 valuePrint의 void 메서드 또는 함수와 함수 본문을 만듭니다.

class CiMA
  {
public:
   string            MAType;
   double            MAArray[];
   int               MAHandle;
   double            MAValue;
   void              valuePrint()
     {
      Print(MAType," Current Value: ",MAValue);
     };
  };

클래스에서 모든 이동 평균의 다음과 같은 객체를 만듭니다:

  • 평균의 이름
  • 평균의 핸들
  • 평균
//--- SMA
CiMA CSma;
CiMA CSmaHandle;
CiMA CSmaArray;

//--- EMA
CiMA CEma;
CiMA CEmaHandle;
CiMA CEmaArray;

//--- SMMA
CiMA CSmma;
CiMA CSmmaHandle;
CiMA CSmmaArray;

//--- LWMA
CiMA CLwma;
CiMA CLwmaHandle;
CiMA CLwmaArray;

OnInit 함수 내에서 모든 이동 평균 유형에 대해 다음 단계를 수행합니다:

  • 평균의 이름을 정의합니다.
  • 평균의 핸들을 정의합니다.
  • ArraySetAsSeries를 사용하여 배열에 AS_SERIES 플래그를 설정합니다.
  • CopyBuffer 함수를 사용하여 평균 지표의 버퍼 데이터를 가져옵니다.
  • 평균값을 정의하고 NormalizeDouble 함수를 사용하여 정규화합니다.
  • 생성된 출력 메서드 또는 함수 호출
int OnInit()
  {
   //--- SMA
   CSma.MAType="Simple MA";
   CSmaHandle.MAHandle=iMA(_Symbol,PERIOD_CURRENT,10,0,MODE_SMA,PRICE_CLOSE);
   ArraySetAsSeries(CSmaArray.MAArray,true);
   CopyBuffer(CSmaHandle.MAHandle,0,0,3,CSmaArray.MAArray);
   CSma.MAValue=NormalizeDouble(CSmaArray.MAArray[1],_Digits);
   CSma.valuePrint();

   //--- EMA
   CEma.MAType="Exponential MA";
   CEmaHandle.MAHandle=iMA(_Symbol,PERIOD_CURRENT,10,0,MODE_EMA,PRICE_CLOSE);
   ArraySetAsSeries(CEmaArray.MAArray,true);
   CopyBuffer(CEmaHandle.MAHandle,0,0,3,CEmaArray.MAArray);
   CEma.MAValue=NormalizeDouble(CEmaArray.MAArray[1],_Digits);
   CEma.valuePrint();

   //--- SMMA
   CSmma.MAType="Smoothed MA";
   CSmmaHandle.MAHandle=iMA(_Symbol,PERIOD_CURRENT,10,0,MODE_SMMA,PRICE_CLOSE);
   ArraySetAsSeries(CSmmaArray.MAArray,true);
   CopyBuffer(CSmmaHandle.MAHandle,0,0,3,CSmmaArray.MAArray);
   CSmma.MAValue=NormalizeDouble(CSmmaArray.MAArray[1],_Digits);
   CSmma.valuePrint();

   //--- LWMA
   CLwma.MAType="Linear-weighted MA";
   CLwmaHandle.MAHandle=iMA(_Symbol,PERIOD_CURRENT,10,0,MODE_LWMA,PRICE_CLOSE);
   ArraySetAsSeries(CLwmaArray.MAArray,true);
   CopyBuffer(CLwmaHandle.MAHandle,0,0,3,CLwmaArray.MAArray);
   CLwma.MAValue=NormalizeDouble(CLwmaArray.MAArray[1],_Digits);
   CLwma.valuePrint();
   return(INIT_SUCCEEDED);
  }

이 코드를 컴파일하고 실행하면 모든 유형의 이동 평균에 대해 각각의 줄이 다음과 같이 동일한 평균 값을 출력하는 네개의 줄을 찾을 수 있습니다:

 지표 출력

앞서 살펴본대로 우리는 이러한 애플리케이션을 개발하여 더 복잡하고 고급의 작업을 구현할 수 있지만 여기서는 우선 객체 지향 프로그래밍(OOP)의 기본 사항을 배우고 이해하는 것이 목표였습니다. 이 유용한 접근 방식을 적용할 때 얻을 수 있는 많은 기능들이 있으므로 우리는 MQL5에서 이 접근 방식을 어떻게 적용할 수 있는지 알아보는 것입니다.


결론

이 글에서는 프로그래밍 전반에서 매우 중요한 주제와 접근 방식에 대한 기본 사항을 배웠습니다. 우리는 이 접근 방식이 안전하고 보안성이 높은 소프트웨어를 만드는 데 도움이 되고 코드를 작은 코드 블록으로 나누어 코딩 과정을 더 쉽게 만들어 소프트웨어 제작의 복잡성을 줄이고 동작이 다르더라도 충돌 없이 같은 클래스에서 많은 인스턴스를 만들 수 있으며 소프트웨어를 업데이트할 때 유연성과 안전성을 높이는 데 도움이 되는 방법을 배움으로써 소프트웨어 설계 시 얼마나 유용한지에 대해 배웠습니다.

이 모든 놀라운 기능을 얻기 위해 MQL5에서 이 중요한 접근법을 적용하는 방법도 배웠고 MetaTrader 5에서 사용할 수 있도록 MQL5의 OOP 접근법을 적용하여 만들 수 있는 간단한 애플리케이션을 만들어 보았습니다.

이 글이 여러분께 도움이 되었기를 바랍니다. 이 OOP 접근 방식을 적용하면 코딩할 때 얼마나 많은 아이디어를 쉽게 얻을 수 있는지에 더 많은 통찰력을 얻을 수 있으실 것입니다. 이는 MQL5 프로그래밍에서 매우 중요하고 중요한 주제입니다.

이 기사가 마음에 들었고 가장 인기 있는 보조지표를 기반으로 MQL5 거래 시스템을 만드는 방법과 사용자 지정 보조지표를 만들어 Expert Advisor에서 사용하는 방법에 대해 자세히 알고 싶다면 제 프로필의 게시물을 통해 이러한 주제에 대한 다른 기사를 읽을 수 있으실 것입니다.

MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/12813

파일 첨부됨 |
indicatorClass.mq5 (2.09 KB)
priceClass.mq5 (1.7 KB)
최근 코멘트 | 토론으로 가기 (6)
Alexey Viktorov
Alexey Viktorov | 22 9월 2023 에서 08:24
Alexey Volchanskiy #:

와우, 시간이 어떻게 날아가는지 )). 약 10 년 전에 저는이 포럼의 러시아어와 영어 부분에서 OOP에 대한 지점을 열려고했습니다. 러시아 부분에서 나는 모든 것이 복잡하고 우리 프롤레타리아 인은 그것을 필요로하지 않는다는 히스테리를 얻었습니다! 할아버지들은 쟁기로 쟁기질을했고 우리는 전통을 깨지 않을 것입니다! 영어 부분에서는 설명없이 단순히 가지를 죽였습니다.

그리고 이제 우리는 모하메드가 가르칩니다 )). 이 기사는 지루한 학술 교과서의 재 인쇄물이며 첫 번째 단락에서 잠이 들었습니다.

아마도 너무 이른 것 같습니다. 당시에는 업무에 OOP를 사용하는 사람이 거의 없었습니다. 그리고 그것을 알고 사용하는 사람들은 그것에 대해 논의하는 데 시간을 낭비하고 싶지 않았습니다.

Alexey와는 달리 저는 잠들지 않고 끝까지 읽었지만 기사 중간부터 몇 줄 건너 뛰기 시작했습니다... 일반적으로 기사가 마음에 들지 않았습니다. 문서에 없는 내용은 아무것도 보이지 않습니다.

Valeriy Yastremskiy
Valeriy Yastremskiy | 22 9월 2023 에서 10:55

OOP의 정의부터 시작하겠습니다. OOP는 DRY(반복하지 않기) 개념을 적용하여 작업과 코드의 중복 없이 재사용 가능한 소프트웨어를 만들고 개발할 수 있도록 도와줍니다.

그렇다면 OOP의 정의는 어디에 있을까요?

캡슐화는 다음을 허용하는 캡슐화입니다. 찾기 어렵습니다. OOP에 대한 가시성 개념은 분명히 비공개입니다)))) 그리고 그 액세스 수정자는 캡슐화입니다. 독자는 스스로 추측해야합니다)))).

200 개의 터그 릭에 대한 교과서에서 발췌문을 만드는 것은 정상적인 사업입니다. GPT없이 직접 작성했으면합니다)))).

Viktor Vlasenko
Viktor Vlasenko | 25 9월 2023 에서 02:26

다음에서

" OnInit 함수 내에서 세 개의 시간대에 대해 다음을 정의합니다:

  • 문자열 기간 "

기사의 품질은 번역의 품질에 따라 결정됩니다.

Fedor Arkhipov
Fedor Arkhipov | 26 9월 2023 에서 21:24
마흐무드는 노력 중이었고, 당신은 그냥 뛰어들었습니다 :-)
Denis Kirichenko
Denis Kirichenko | 26 9월 2023 에서 22:39
Fedor Arkhipov #:
마흐무드는 노력하고 있었고 당신은 그에게 뛰어 들었습니다 :-)))
그게 공격당하는 가장 쉬운 방법이에요))
마흐무드는 "개가 짖으면 캐러밴은 제 갈 길을 간다"는 속담을 알고 있을 겁니다.
새로운 기능: MQL5의 커스텀 인디케이터 새로운 기능: MQL5의 커스텀 인디케이터
MetaTrader5와 MQL5의 새로운 기능 전체를 나열하지는 않겠습니다. 종류도 많은 데다가, 별도의 설명이 필요한 기능들도 있거든요. 객체 지향 프로그래밍을 이용한 코드 작성법 또한 다음에 알아보도록 하겠습니다. 다른 기능들과 함께 설명하기에는 조금 어려운 이야기일 수 있으니까요. 이 글에서는 인디케이터와 인디케이터의 구조, 드로잉 타입과 프로그래밍 디테일을 MQL4와 비교해 볼게요. 초보자 분들께 많은 도움이 되면 좋겠고 기존에 사용하시던 개발자 분들도 뭔가 새로운 걸 얻어 가실 수 있길 바랍니다.
MQL5를 사용하여 사용자 지정 돈치안(Donchian) 채널 지표를 만드는 방법 MQL5를 사용하여 사용자 지정 돈치안(Donchian) 채널 지표를 만드는 방법
가격을 둘러싼 채널을 시각화 하는 데 사용할 수 있는 많은 기술 도구가 있습니다. 이러한 도구 중 하나가 돈치안 채널 지표입니다. 이 글에서는 돈치안 채널 지표를 만드는 방법과 EA를 사용하여 사용자 지정 지표로 거래하는 방법에 대해 알아보겠습니다.
새 MetaTrader 와 MQL5를 소개해드립니다 새 MetaTrader 와 MQL5를 소개해드립니다
본 문서는 MetaTrader5의 간략 리뷰입니다. 짧은 시간 내에 시스템의 모든 세부 사항을 안내해드리기는 어렵습니다 - 테스트는 2009.09.09에 시작되었습니다. 이는 상징적인 일자로, 전 이것이 행운의 숫자가 될거라 믿어 의심치않습니다. 제가 새 MetaTrader 5 터미널과 MQL5 베타버전을 받은지 며칠이 지났습니다. 아직 모든 기능을 사용해본 것은 아니지만, 벌써부터 감명깊네요.
HarmonyOS NEXT에 MetaTrader 5 및 기타 MetaQuotes 앱 설치 HarmonyOS NEXT에 MetaTrader 5 및 기타 MetaQuotes 앱 설치
DroiTong을 사용하여 HarmonyOS NEXT 기기에 MetaTrader 5 및 기타 MetaQuotes 앱을 쉽게 설치하세요. 휴대전화나 노트북을 위한 자세한 단계별 가이드입니다.