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

 
Dmitry Fedoseev :

그리고 클래스를 사용하지 않으면 계속해서 SymbolInfoDouble(_Symbol,MODE_BID)과 같은 것을 작성하여 괴로움을 당할 것입니다. 매번 그런 춤을 추고 대괄호와 밑줄을 긋고 capslock을 눌러야하는지 (그런 다음 다른 곳에서 보지 않고 전체 줄을 대문자로 입력하고 다시 입력하십시오) Shift 키를 계속 누르고 있어야하는지 알 수 없습니다. 적어도 이 OOP에서는 유용합니다. 최소한 이러한 모든 기능에 대한 클래스를 만들면 그렇습니다. 그것은 거대합니다. 자신을 위해 쓴다면 문제가 되지 않습니다. 주문 작업의 경우 자주 사용하는 기능이 많지 않으므로 라이브러리에 몇 가지 기능을 추가하기만 하면 됩니다. 그러나 일반적으로 아직 이상적인 접근 방식은 없습니다.

글쎄, 꽤 많지도 않고 많지도 않은 것처럼, 주문을 하기 위해 행동을 수행해야 한다고 꽤 적절하게 말할 수 있습니다. 여기에 열거나/닫고/손절매를 설정할 수 있는 클래스에 대한 제 비전이 있습니다 . 주문하다

 class CConstVolume
{
protected :
   static const double   VolumeMAX;
   static const double   VolumeMIN;
   static const double   VolumeSTEP;
   static const double   ZerroPrice;
   static const int      VolumeDIGITS;
   static int            GetDigitsInVolumeStep(); };
//___________________________________________________________________________
static int CConstVolume::GetDigitsInVolumeStep()
{   int result = 0 ;
   long i = 10000000 , k = long (:: SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP ) / 0.0000001 );
   while (result < 7 && k % i > 0 )
   {  i /= 10 ;
      result++; }
   return (result); }
//____________________________________________________________________
static const double CConstVolume::VolumeMAX = :: SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX );
//____________________________________________________________________
static const double CConstVolume::VolumeMIN = :: SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN );
//____________________________________________________________________
static const double CConstVolume::VolumeSTEP = :: SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );
static const double CConstVolume::ZerroPrice = :: NormalizeDouble ( 0.0 , _Digits );
//____________________________________________________________________
static const int CConstVolume::VolumeDIGITS = CConstVolume::GetDigitsInVolumeStep();
//____________________________________________________________________




//+------------------------------------------------------------------+
//|   class COrder                                                   |
//+------------------------------------------------------------------+
class COrder : private CConstVolume
{
private :
   SOrderInfo        m_info;         //структура для инициализации класса, и хранения информации о ордере, тип, цена отркытия, лот, и состояние ордера
   CError            error;         //класс с описание ошибок на 2-х языках
   int                sl_error_count; //счетчик ошибок установки стоплосса/тейка
   bool               m_needstoploss; //флаг для установки стоплосса, сбросим когда все ОК
   bool               CheckMarginRequirements();
   bool               ServerDisable();
   int                Ordersend ();
   int                CheckOrderByMagicnumber( int magic_);   //метод нужен для поиска открытого ордера по магику, использую в конструкторе
   void               SetStoploss();
   void               NULLOrder()             { ZeroMemory (m_info); m_info.cmd = - 1 ; m_info.status = ErrorOrder; m_needstoploss = false ;   }
   void               PrintError( string func) { Print (func); error. GetLastError ();                                                         }
public :
                     COrder():m_needstoploss( false ) { NULLOrder();                                                                        }
                     COrder(SOrderInfo &ordersetting);
   SOrderInfo        GetOrderInfo(); 
   bool               Orderclose();};
//________________________________

단일 문자에 사용하려면 - 특히 정적 클래스 사용

일반적으로 모든 것이 의도한 대로 작동합니다 ....하지만 위에서 쓴 것처럼 마음에 들지 않습니다. 제 생각에는 번거롭고 불필요한 것은 없습니다.

 
Dmitry Fedoseev :

그리고 클래스를 사용하지 않으면 SymbolInfoDouble(_Symbol, SYMBOL_BID )과 같은 것을 지속적으로 작성하는 데 어려움을 겪을 것입니다. 매번 이런 춤...

절차 스타일의 프레임워크 내에서 유지하면서 이러한 함수에 대한 더 편리하고 간결한 래퍼를 만들 수 있습니다. 특히 최신 빌드에서 네임스페이스가 마침내 추가되었다는 사실을 고려하면 일반적으로 실수입니다. 이전에는 정적 메서드의 형태로 구현해야 했지만 이제는 모든 것이 크게 단순화되었습니다.

 namespace SymbolInfo
{
   double Bid( string symbol) { return SymbolInfoDouble (symbol, SYMBOL_BID ); }
   double Ask( string symbol) { return SymbolInfoDouble (symbol, SYMBOL_ASK ); }
};
 
Alexey Navoykov :

절차 스타일의 프레임워크 내에서 유지하면서 이러한 함수에 대한 더 편리하고 간결한 래퍼를 만들 수 있습니다. 특히 최신 빌드에서 네임스페이스가 마침내 추가되었다는 사실을 고려하면 일반적으로 실수입니다. 이전에는 정적 메서드의 형태로 구현해야 했지만 이제는 모든 것이 크게 단순화되었습니다.

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

 
Igor Makanu :

글쎄, 꽤 많지도 적지도 않은 것처럼, 주문을 하기 위해 조치를 취해야 한다고 꽤 적절하게 말할 수 있습니다. 여기에 열거나/닫고/손절매를 설정할 수 있는 클래스에 대한 제 비전이 있습니다 . 주문하다

단일 문자에 사용하려면 - 특히 정적 클래스 사용

일반적으로 모든 것이 의도한 대로 작동합니다 ....하지만 위에서 쓴 것처럼 마음에 들지 않습니다. 제 생각에는 번거롭고 불필요한 것은 없습니다.

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

 
Alexey Navoykov :

절차 스타일의 프레임워크 내에서 유지하면서 이러한 함수에 대한 더 편리하고 간결한 래퍼를 만들 수 있습니다. 특히 최신 빌드에서 네임스페이스가 마침내 추가되었다는 사실을 고려하면 일반적으로 실수입니다. 이전에는 정적 메서드의 형태로 구현해야 했지만 이제는 모든 것이 크게 단순화되었습니다.

간결한 기록이 없습니다. 수표가 없으면 다음과 같이 작성하는 것이 더 쉽습니다.

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

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

단일 문자에 사용하려면 - 특히 정적 클래스 사용

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

간결한 기록이 없습니다. 수표가 없으면 다음과 같이 작성하는 것이 더 쉽습니다.

SymbolInfoDouble 과 같은 기능이 많이 있습니다. 당신은 모든 사람의 짧은 이름을 지어내는 것에 괴로워합니다. 클래스로 수집함으로써 이름의 고유성에 대해 전혀 걱정할 필요가 없습니다.

 

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

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

간결한 기록이 없고 수표가 없으면 있는 그대로 작성하는 것이 더 쉽습니다.

그렇게 하는 것이 아닙니다. 최소한 Bid()와 Ask()를 모두 호출해야 합니다. 값이 변경되지 않은 것처럼 보이기 때문에 실제로는 그렇지 않습니다.
 
Alexey Navoykov :
심볼의 이름을 생성자에 전달하여 클래스를 유연하고 보편적으로 만드는 것을 방지하는 것은 무엇입니까? 포트폴리오 트레이딩의 가능성을 근본적으로 고려하고 있습니까?

그것은 대부분 단일 문자 Expert Advisors가 작성되고 대부분의 경우 문자 전송이 추가(그리고 소모)) 작업이 된다는 사실을 방해합니다. 또 하나는 기본적으로 차트의 심볼이 자동으로 선택되도록 하고, 필요에 따라 일시적으로 심볼을 재정의할 수 있도록 하는 것입니다. 그러나 클래스의 하나의 인스턴스를 사용하고 필요한 경우 기호를 재정의하거나 각 기호에 대해 고유한 인스턴스를 만드는 것이 더 나은 문제가 다시 발생합니다.