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

 

안녕하세요 여러분!

합리적인 OOP 교육은 어디에도 없기 때문에 이 주제를 만들어야 할 때가 되었다고 생각합니다.

초보자를 위한 더 복잡하고 이해할 수 없는 코드 예제로 "초보자의 질문" 스레드를 막는 것은 가치가 없을 것입니다.

두 개의 기사를 읽은 후 MQL5 의 객체 지향 프로그래밍 OOP의 기본 사항: 오류 및 경고 코드 처리

코드 예제를 작성했는데 자세히 다루려고 하며, 또한 코드를 게시하고 함께 구문 분석하는 것이 좋습니다.

다음에 관심:

  • 코드가 올바르게 작성되었습니까?
  • 코드를 개선하는 방법?
  • 코드 속도를 높이는 방법은 무엇입니까?
주문을 여는 내 코드:

 #property strict
input int Slip= 30 ;
input int Magic= 0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
class vr_trade
  {
private :
   int                openorders( string sy, int typ, double lot, double price);
   string             tip( int typ);
public :
   int                Buy( string sy, double lot);
   int                Sel( string sy, double lot);
   int                BuyLimit( string sy, double lot, double price);
   int                SelLimit( string sy, double lot, double price);
   int                BuyStop( string sy, double lot, double price);
   int                SelStop( string sy, double lot, double price);
                     vr_trade(){}
                    ~vr_trade(){}
  };
MqlTick st;
vr_trade trade;
//+------------------------------------------------------------------+
void OnTick ()
  {
trade.Buy( "EURUSD" , 0.01 ); // Пример открытия позиции возвращающей тиккет ордера.
  }
//+------------------------------------------------------------------+  
int vr_trade :: Buy( string sy, double lot)
{
return openorders(sy, 0 ,lot);
}
//+------------------------------------------------------------------+  
int vr_trade :: Sel( string sy, double lot)
{
return openorders(sy, 1 ,lot);
}
//+------------------------------------------------------------------+  
int vr_trade :: BuyLimit( string sy, double lot, double price)
{
return openorders(sy, 2 ,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: SelLimit( string sy, double lot, double price)
{
return openorders(sy, 3 ,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: BuyStop( string sy, double lot, double price)
{
return openorders(sy, 4 ,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: SelStop( string sy, double lot, double price)
{
return openorders(sy, 5 ,lot,price);
}
//+------------------------------------------------------------------+
int vr_trade :: openorders( string sy= "" , int typ= 0 , double lot= 0 , double price= 0 )
  {
   int tik=- 2 ;
   double di= NormalizeDouble ( 500 * _Point , _Digits );
   if (sy== "" ){sy= _Symbol ; Print ( "Установлен символ текущего графика " ,sy);}
   if (lot< MarketInfo (sy, MODE_MINLOT )){lot= MarketInfo (sy, MODE_MINLOT ); Print ( "Советник скорректировал лот " ,lot);}
   if (! SymbolInfoTick (sy,st)) Print ( "Не удалось прогрузить цены для символа " ,sy);
   if (price== 0 )
     {
       if (typ== 0 )price=st.ask;
       if (typ== 1 )price=st.bid;
       if (typ== 2 )price=st.ask-di;
       if (typ== 3 )price=st.bid+di;
       if (typ== 4 )price=st.ask+di;
       if (typ== 5 )price=st.bid-di;
     }
   if ( IsTradeAllowed ()== true )
     {
       RefreshRates ();
      tik= OrderSend (sy,typ,lot,price,Slip, 0 , 0 , "" ,Magic, 0 , clrRed );
       if (tik> 0 ) Print ( "Успешно открыт ордер Ticket " ,tik, " Typ " ,tip(typ), " Symbol " ,sy, " Lot " ,lot, " Price " ,price);
       else Print ( "Ошибка открытия ордера N" ,GetLastError());
     }
   else
       Print ( "Торговый поток занят" );
   return tik;
  }
//+------------------------------------------------------------------+
string vr_trade :: tip( int typ)
  {
   string txt= "" ;
   switch (typ)
     {
       case 0 : txt= "BUY" ;         break ;
       case 1 : txt= "SELL" ;       break ;
       case 2 : txt= "BUY LIMIT" ;   break ;
       case 3 : txt= "SELL LIMIT" ; break ;
       case 4 : txt= "BUY STOP" ;   break ;
       case 5 : txt= "SELL STOP" ;   break ;
       default : txt= "Ошибка типа ордера" ;
     }
   return txt;
  }
//+------------------------------------------------------------------+
 
저것들. OOP는 클래스에 함수를 채우는 것뿐입니까? 생산적이며 곧 포럼에서 재미있을 것입니다.
 
VOLDEMAR :


  • 코드가 올바르게 작성되었습니까?
  • 코드를 개선하는 방법?
  • 코드 속도를 높이는 방법은 무엇입니까?


옳고 그름은 무슨 뜻인가요? 그것은 오류없이 작동합니다. 그것은 올바르게 의미합니다. 작동하지 않으면 잘못된 것입니다.

개선하다. 뭔가가 필요에 맞지 않을 때 개선이 필요합니다. 이 방향으로 개선하고 필요로하지 않는 것은 무엇입니까?

속도를 높이는 이유는 무엇입니까? 테스터의 총 틱 수에 비해 주문이 그렇게 자주 열리지는 않습니다.

그러나 그것은 철학이었습니다.

관행. 우수한 표준이 있는 경우 이 클래스가 필요한 이유는 무엇입니까? 네, MT5용인데 MT4용인지 모르겠네요. 없기?

당신의 코드에는 손절매와 이익실현이 없다는 한 가지 단점이 있습니다.

 
TheXpert :
저것들. OOP는 클래스에 함수를 채우는 것뿐입니까? 생산적이며 곧 포럼에서 재미있을 것입니다.

당신이 그렇게 똑똑하다면 올바른 방법으로 작성하십시오. 주제는 풍자에 대해 생성되지 않았습니다 ....
 
VOLDEMAR :

당신이 그렇게 똑똑하다면 올바른 방법으로 작성하십시오. 주제는 풍자에 대해 생성되지 않았습니다 ....


당신의 욕망, 필요, 당신의 프로그래밍 스타일에 달려 있습니다.

당신은 당신이 했던 것처럼 매개변수가 있는 함수의 집합으로 클래스를 만들 수 있습니다.

매개변수를 설정하는 메소드를 생성하고, 매개변수 없이 메소드를 호출하여 직접 주문을 열 수 있습니다.

두꺼울 때 더 좋고 다른 경우에 더 적합합니다. 이상적으로 보편적인 것 이상을 하려고 하는 것은 바보의 꿈이며 정신적 노력의 낭비입니다.

더. 20번까지 하나의 동일한 문제를 해결해야 하는 경우에는 보편적인 접근 방식의 생성을 취하지 않는 것이 좋습니다.

 
Integer :


옳고 그름은 무슨 뜻인가요? 그것은 오류없이 작동합니다. 그것은 올바르게 의미합니다. 작동하지 않으면 잘못된 것입니다.

개선하다. 뭔가가 필요에 맞지 않을 때 개선이 필요합니다. 이 방향으로 개선하고 필요로하지 않는 것은 무엇입니까?

속도를 높이는 이유는 무엇입니까? 테스터의 총 틱 수에 비해 주문이 그렇게 자주 열리지는 않습니다.

그러나 그것은 철학이었습니다.

관행. 우수한 표준이 있는 경우 이 클래스가 필요한 이유는 무엇입니까? 네, MT5용인데 MT4용인지 모르겠네요. 없기?

당신의 코드에는 손절매와 이익실현이 없다는 한 가지 단점이 있습니다.


어떤 유형의 계정에서 작업할지 모를 가능성이 높기 때문에 손실을 중지 하고 주문에 대한 주문을 별도로 설정합니다....
 
Integer :

매개변수를 설정하는 메소드를 생성하고, 매개변수 없이 메소드를 호출하여 직접 주문을 열 수 있습니다.

내 예를 들어 이것을 증명할 수 있습니까?

 

코드에 대한 거부감. 일반적으로... 개인 섹션에서 손절매, 이익실현, 로트 값에 대한 변수를 선언합니다. 이러한 변수는 주문개방 방식에 사용되며, 로트는 그대로 사용되며, 이러한 변수를 사용하여 가격 수준이 계산됩니다. 그러나 이러한 변수는 값으로 설정해야 합니다. 따라서 SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value)와 같은 메서드가 필요합니다.

대부분의 Expert Advisors에서는 인터넷에서 SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) 메서드를 한 번만 호출하는 것으로 충분합니다. 매개변수 없이 주문을 여는 메소드를 호출 하면 실행 시간이 상당히 빨라집니다.

 
VOLDEMAR :
당신이 그렇게 똑똑하다면 올바른 방법으로 작성하십시오. 주제는 풍자에 대해 생성되지 않았습니다 ....
필요하지 않은 곳에 OOP를 유치할 필요는 없습니다. 개체가 있다고 해서 코드가 더 빠르고 효율적이지는 않습니다.
 

언제나처럼 배우고 싶었지만 똑똑하고 더 이상 할 말이 없는 사람들이 분명히 있을 것입니다 ...

나는 그것을 구문 분석하기 위해 간단한 예제를 작성했습니다. OOP로 더 올바르게 작성하는 방법을 모르겠습니다 ... 이것은 단지 예일뿐입니다. 그러한 코드와 OOP를 올바르게 작성하는 방법을 알고 있다면 나와 다른 사람들이 배울 수 있습니다...

 
VOLDEMAR :

언제나처럼 배우고 싶었지만 똑똑하고 더 이상 할 말이 없는 사람들이 분명히 있을 것입니다 ...

나는 그것을 구문 분석하기 위해 간단한 예제를 작성했습니다. OOP로 더 올바르게 작성하는 방법을 모르겠습니다 ... 이것은 단지 예일뿐입니다. 그러한 코드와 OOP를 올바르게 작성하는 방법을 알고 있다면 나와 다른 사람들이 배울 수 있습니다...


관심을 기울이지 마세요.

* * *

우리는 매개변수를 전달 하지 않고 주요 메소드와 가장 일반적으로 사용되는 메소드가 호출되도록 노력해야 합니다. 이렇게 하면 성능이 향상됩니다. 그러나 편의성이 떨어집니다.