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

 
Vladimir Simakov :
문제. 염소에게 단추 아코디언이 필요한 이유는 무엇입니까? 하나의 방법, 하나의 클래스, 구형 말에서, 그러나 물리적 진공 상태에서(글쎄요, 저는 취했습니다)))), 네, 이해가 됩니다. 그리고 실제 프로젝트에서 글로벌 수준의 클래스 또는이 모든 트리코무딘을 처리하는 외로운 사람 (추가 버번은 죄송합니다))))) 핸들러 시작 부분에서 어디에서나 직접 요청) ))

이것은 작업을 분배하고 작은 종속 클래스 무리로부터 결과를 수신하는 클래스 관리자입니다)))

일반적으로 냉정하게 설명하기 어렵다

그러나 질문은 관련이 있습니다. 다른 방법에서 매우 자주 이러한 필드의 값을 읽는 경우 공통 필드의 주소 지정은 어떻게됩니까?

 
Igor Makanu :

이것은 작업을 분배하고 작은 종속 클래스 무리로부터 결과를 수신하는 관리자 클래스입니다)))

일반적으로 냉정하게 설명하기 어렵다

그러나 질문은 관련이 있습니다. 다른 방법에서 매우 자주 이러한 필드의 값을 읽는 경우 공통 필드의 주소 지정은 어떻게됩니까?

바라보다. 핸들러 시작 시, 어느 것이든 gSomeGlobal.SomeEvent(...)를 실행하거나, 혼자인 경우 Alone::SomeEvent(...)를 실행하면 이 메서드에서 필요한 상태 처리를 수행합니다. 그런 다음 getters를 통해 필요한 데이터를 요청하기만 하면 됩니다. 고주파 스캘퍼가있을 때까지 여기에는 특별한 오버 헤드 헤드가 없지만 숲의 모든 속도 챔피언을 보냅니다.)))
 
Vladimir Simakov :
바라보다. 핸들러 시작 시, 어느 것이든 gSomeGlobal.SomeEvent(...)를 실행하거나, 혼자인 경우 Alone::SomeEvent(...)를 실행하면 이 메서드에서 필요한 상태 처리를 수행합니다. 그런 다음 getters를 통해 필요한 데이터를 요청하기만 하면 됩니다. 고주파 스캘퍼가있을 때까지 여기에는 특별한 오버 헤드 헤드가 없지만 숲의 모든 속도 챔피언을 보냅니다.)))

MT5 성능은 초당 10,500개 주문에 충분합니다. 채널이면 충분합니다.

일반적으로 나는 진실을 찾고 있었고 확인해야했습니다 ... 당신이 무언가를하고 싶다면 스스로하십시오! )))

 #property copyright "IgorM"
#property link        "https://www.mql5.com/ru/users/igorm"
#property version    "1.00"

#define TST_COUNT 1 e10

#define   SpeedTest(count,msg,EX)   { uint mss= GetTickCount (); ulong lim = count; for ( ulong cnt= 0 ;cnt<lim&&! _StopFlag ;cnt++){EX;} \
                                     printf ( "%s: loops = %llu ms=%u" ,msg,lim, GetTickCount ()-mss);}
//+------------------------------------------------------------------+
class A
{
private :
   double             _Ask, _Bid;
   double             f1()  { return (_Ask + 1.0 /( 1.0 +( double ) rand ())); }
   double             f2()  { return (_Bid + 1.0 /( 1.0 +( double ) rand ())); }
   double             f3()  { return (_Ask/_Bid + 1.0 /( 1.0 +( double ) rand ())); }
public :
   double             calc( const MqlTick &tick){ _Ask = tick.ask; _Bid = tick.bid; return (f1() + f2() + f3()); }
};
//+------------------------------------------------------------------+
class B
{
private :
   double             f1( const MqlTick &t)  { return (t.ask + 1.0 /( 1.0 +( double ) rand ())); }
   double             f2( const MqlTick &t)  { return (t.bid + 1.0 /( 1.0 +( double ) rand ())); }
   double             f3( const MqlTick &t)  { return (t.ask/t.bid + 1.0 /( 1.0 +( double ) rand ())); }
public :
   double             calc( const MqlTick &tick){ return (f1(tick) + f2(tick) + f3(tick)); }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   A a;
   B b;
   MqlTick rnd_tick;
   for ( int i= 0 ; i< 5 ; i++)
   {
      SpeedTest(TST_COUNT, "class A : " ,
               rnd_tick.ask = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());
               rnd_tick.bid = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());
               double res = a.calc(rnd_tick);
      );
   
      SpeedTest(TST_COUNT, "class B : " ,
               rnd_tick.ask = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());
               rnd_tick.bid = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());
               double res = b.calc(rnd_tick);
      );
   }
}
//+------------------------------------------------------------------+

2020.07.25 18:00:07.293 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38062

최적화를 위해서는 작업 속도가 중요하므로 문제가 발생했습니다.

일반적으로 참조로 현재 가격 을 모든 메서드에 전달해야 합니다.



상향:

 //+------------------------------------------------------------------+
class C
{
private :
   double             f1( const double &a, const double &b)  { return (a + 1.0 /( 1.0 +( double ) rand ())); }
   double             f2( const double &a, const double &b)  { return (b + 1.0 /( 1.0 +( double ) rand ())); }
   double             f3( const double &a, const double &b)  { return (a/b + 1.0 /( 1.0 +( double ) rand ())); }
public :
   double             calc( const MqlTick &tick){ const double ask = tick.ask; const double bid = tick.bid; return (f1(ask,bid) + f2(ask,bid) + f3(ask,bid)); }
};
//+------------------------------------------------------------------+

2020.07.25 19:03:37.210 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37985

 
Igor Makanu :

MT5 성능은 초당 10,500개 주문에 충분합니다. 채널이면 충분합니다.

일반적으로 나는 진실을 찾고 있었고 확인해야했습니다 ... 당신이 무언가를하고 싶다면 스스로하십시오! )))

2020.07.25 18:00:07.293 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38062

최적화를 위해서는 작업 속도가 중요하므로 문제가 발생했습니다.

일반적으로 참조로 현재 가격 을 모든 메서드에 전달해야 합니다.



상향:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37985

우선, 우리는 동일한 작업 조건을 수행합니다)))) 그렇지 않으면 절대적으로 불필요한 할당 연산자(2개)를 가져와서 채워서 의도적으로 최적이 아닌 코드를 생성)))

 //+------------------------------------------------------------------+
class A
{
private :
   double             _Ask, _Bid;
   double             f1()  { return (_Ask + 1.0 /( 1.0 +( double ) rand ())); }
   double             f2()  { return (_Bid + 1.0 /( 1.0 +( double ) rand ())); }
   double             f3()  { return (_Ask/_Bid + 1.0 /( 1.0 +( double ) rand ())); }
public :
   void               Init() {_Ask = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());
                             _Bid = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());}
   double             calc(){ return (f1() + f2() + f3()); }
};
//+------------------------------------------------------------------+
class B
{
private :
   double             f1( const MqlTick &t)  { return (t.ask + 1.0 /( 1.0 +( double ) rand ())); }
   double             f2( const MqlTick &t)  { return (t.bid + 1.0 /( 1.0 +( double ) rand ())); }
   double             f3( const MqlTick &t)  { return (t.ask/t.bid + 1.0 /( 1.0 +( double ) rand ())); }
public :
   double             calc( const MqlTick &tick){ return (f1(tick) + f2(tick) + f3(tick)); }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   A a;
   B b;
   MqlTick rnd_tick;
   for ( int i= 0 ; i< 5 ; i++)
   {
      SpeedTest(TST_COUNT, "class A : " ,
               a.Init();
               double res = a.calc();
      );
   
      SpeedTest(TST_COUNT, "class B : " ,
               rnd_tick.ask = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());
               rnd_tick.bid = 1.0 + 1.0 / ( 1.0 + ( double ) rand ());
               double res = b.calc(rnd_tick);
      );
   }
}

이제 질문은 다음과 같습니다. 무엇이 더 편리합니까? 물론 메소드 매개변수를 통해 링크 문자열을 드래그하거나 아름답게 할 수 있습니다. 속도를 직접 비교

 
Vladimir Simakov :

그렇지 않으면 절대적으로 불필요한 할당 연산자(2개)를 가져와서 채워 넣음으로써 의도적으로 최적이 아닌 코드를 생성)))

내가 아니야!

이것은 IBM 지식 센터입니다! https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



조건이 동일하고 클래스 관리자(또는 수퍼 클래스, 일반적으로 xs)를 호출하는 데 필요한 모든 틱

전략에 따라 작동하는 나머지 클래스를 호출합니다.

그러나 주제에 따르면 - 옵션 C는 속도면에서 실제로 승리합니다. 즉, 진실을 말하는 것처럼 보이는 지식 센터입니다.

 
Pavel Verveyko :

이것이 결함인지 기능인지 궁금합니다)

클래스의 인스턴스 내부에는 구조체가 있습니다.

구조의 내용을 보기 위해 끝을 냈습니다.
단, 대괄호를 넣어야 표시됩니다.
구조는 하나의 인스턴스에 있지만.

클래스가 배열의 요소 가 아니면 문제가 해결됩니다.




음, "파킹"에 대한 코드

오류가 있더라도 컴파일을 시도하십시오. 때로는 편집기를 "깨워"

 
Igor Makanu :

내가 아니야!

이것은 IBM 지식 센터입니다! 현재 가격 을 모든 메서드에 전달해야 합니다.



상향:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37985

이고르 마카누 :

내가 아니야!

이것은 IBM 지식 센터입니다! https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



조건이 동일하고 클래스 관리자(또는 수퍼 클래스, 일반적으로 xs)를 호출하는 데 필요한 모든 틱

전략에 따라 작동하는 나머지 클래스를 호출합니다.

그러나 주제에 따르면 - 옵션 C는 속도면에서 실제로 승리합니다. 즉, 진실을 말하는 것처럼 보이는 지식 센터입니다.

당연히 이깁니다))) 그러나 최적으로 작성되었기 때문이 아니라 컴파일러가 똑똑해졌기 때문입니다)) 깨끗한 물 최적화. 릴리스 코드에는 매도 및 입찰 값 할당이 없습니다.))) 지옥보다 처리 매개 변수가 조금 적고 프로젝트의 비즈니스 로직이 주문을 여는 것보다 조금 더 발전할 때만 표시기, 그러면 링크 문자열의 전체 프로젝트를 통해 어떻게 슬프게 끌리는지 보게 될 것입니다.)) 그리고 예, 이미 과도한 최적화의 죄에 대해 말했습니다. 저를 믿으세요. 98%의 경우에는 필요하지 않습니다.

 
Vladimir Simakov :

그리고 예, 나는 이미 과도한 최적화의 죄에 대해 말했습니다. 저를 믿으세요. 98%의 경우에는 필요하지 않습니다.

나는 믿는다! ... 그러나 나는 요철을 모을 때까지 도달하지 않을 것이라고 등으로 느낀다))))

좋습니다, ATP, 이 연구에는 건전한 결이 있습니다.

 
Igor Makanu :


상향:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=37985

또한 이것을 시도하십시오:

 class D
{
   double f1( const double &a, const double &b)  { return (a + 1.0 /( 1.0 +( double ) rand ())); }
   double f2( const double &a, const double &b)  { return (b + 1.0 /( 1.0 +( double ) rand ())); }
   double f3( const double &a, const double &b)  { return (a/b + 1.0 /( 1.0 +( double ) rand ())); }
   
public :
   double calc( const MqlTick & tick )
   {
       return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid );
   }
};
 
Koldun Zloy :

또한 이것을 시도하십시오:

2020.07.26 09:39:21.350 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000 ms=46157

2020.07.26 09:39:59.402 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38046

2020.07.26 09:40:37.455 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=38063

2020.07.26 09:41:15.485 class_global (EURUSD,H1) 클래스 D :: 루프 = 10000000000 ms=38031

2020.07.26 09:42:01.749 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46266

2020.07.26 09:42:39.754 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.26 09:43:17.753 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=38000

2020.07.26 09:43:55.743 class_global (EURUSD,H1) 클래스 D :: 루프 = 10000000000ms=37984

동일한 값, 어떤 이유로 테스트 속도가 "부동"하지만 참조로 메서드에 매개변수를 전달하는 것이 훨씬 더 효율적입니다.