내 접근 방식. 코어 - 엔진. - 페이지 126

 
Nikolai Semko :
MT4라면 그렇습니다.
내가 알기로 MT5는 MT4와 달리 완전한 멀티 코어 및 멀티 스레딩을 지원합니다.

부하를 제거하기 위해서는 OpenCL을 사용해야 할 것 같습니다. 그러나 MT4에서는 그렇지 않습니다. 아니면 그냥 참으세요.

또 다른 옵션은 사용자가 애니메이션 다시 그리는 속도를 제어할 수 있도록 하는 것입니다. 이 경우 필요할 때 프로세서의 부하를 줄이고 원하는 경우 다시 증가시킬 수 있습니다.

 
Реter Konow :

부하를 제거하기 위해서는 OpenCL을 사용해야 할 것 같습니다. 그러나 MT4에서는 그렇지 않습니다. 아니면 그냥 참으세요.

또 다른 옵션은 사용자가 애니메이션 다시 그리는 속도를 제어할 수 있도록 하는 것입니다. 이 경우 필요할 때 프로세서의 부하를 줄이고 원하는 경우 다시 늘릴 수 있습니다.

지금은 MT5로 전환하십시오.
MT5에서 두 명의 Expert Advisors가 서로 다른 창에 설치되어 있지만 한 창의 리소스로만 작업하는 것을 확인하는 것은 흥미로운 일입니다. 결국 각 Expert Advisor에는 고유한 스트림이 있으며, 아시다시피 하나의 창에 둘 이상의 Expert Advisor를 던질 수 없습니다.
 
Nikolai Semko :
MT5에서 두 명의 Expert Advisors가 서로 다른 창에 설치되어 있지만 한 창의 리소스로만 작업하는 것을 확인하는 것은 흥미로운 일입니다. 결국, 각 Expert Advisor에는 고유한 스트림이 있으며, 아시다시피 하나의 창에 둘 이상의 Expert Advisor를 던질 수 없습니다.

따라서 MT4에서는 각 어드바이저에도 고유한 흐름이 있는 것 같습니다. 내가 틀리지 않는 경우...

스레드는 자체이지만 프로세서는 모든 사람에게 동일합니다 ...

그것이 그들이 그래프 맵을 만든 이유라고 생각합니다.

 

또 다른 뉘앙스가 있습니다.

애니메이션 이 순환하는 경우(예: gif) 픽셀 배열을 영구적으로 다시 초기화할 필요가 없습니다. 하나의 애니메이션 그리기 주기를 거쳐 각 프레임을 리소스에 저장할 수 있습니다. 다음으로 이미지를 전환하면 됩니다. 부분적으로 구현했는데 덕분에 애니메이션의 다중 가속을 달성했습니다. (처음에는 애니메이션 속도가 끔찍했습니다. 매번 원본 이미지를 다시 그리고 그 위에 새 이미지를 그리기 때문입니다.)

 
Реter Konow :

따라서 MT4에서는 각 어드바이저에도 고유한 흐름이 있는 것 같습니다. 내가 틀리지 않는 경우...

스레드는 자체이지만 프로세서는 모든 사람에게 동일합니다 ...

그것이 그들이 그래프 맵을 만든 이유라고 생각합니다.

MT4와 MT5의 차이점을 이해하기 위해 이 코드를 두 플랫폼 모두에서 실행하면(코드가 여기 저기에서 작동함) MT4에서 훨씬 느리게 작동한다는 것을 알 수 있습니다.

 #define protected public
#include <Canvas\Canvas.mqh>
#undef protected
#property script_show_inputs 
input uint N= 8 ; // количество центов гравитации
void OnStart ()
  {
   ChartSetInteger ( 0 , CHART_FOREGROUND , true );
   CCanvas C;
   int Width=( ushort ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );                               // get Window width
   int Height=( ushort ) ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS );                             // get Window height 
   if (!C.CreateBitmapLabel( 0 , 0 , "CanvasExamlple" , 0 , 0 ,Width,Height, COLOR_FORMAT_XRGB_NOALPHA )) // create canvas with the size of the current window
       Print ( "Error creating canvas: " , GetLastError ());
   uint i= 0 ,j= 100000 ;
   int size=Width*Height;
   uchar h[ 25600 ];
   ArrayInitialize (h, 0 );
   uint w;
   for (w= 0 ;w< 25600 ;w++) h[w]= uchar ( 128 + 128 * sin ( double (w)/ 256 )); //create an array to speed up the work
   double SQRT[];
   uint ss=Width*Width+Height*Height;
   Print (ss);
   ArrayResize (SQRT,ss);
   for (w= 0 ;w<ss;w++) SQRT[( int )w]= sqrt (w); //create an array to speed up the work 
   int k[]; ArrayResize (k,N* 2 );
   for (w= 0 ;w<N* 2 ;w++) k[w]= 20 + rand ()% 200 ;
   double XP[],YP[],D[],D1[];
   ArrayResize (XP,N);
   ArrayResize (YP,N);
   ArrayResize (D,N);
   ArrayInitialize (XP, 0 );
   ArrayInitialize (YP, 0 );
   ulong t= 0 ,sum= 0 , f= 0 ;
   C.FontSet( "Verdana" , 50 , FW_MEDIUM );
   while (! IsStopped ())
     {
       int pos= int (i%size);
       if (pos== 0 )
        {
         //Sleep(20); //For those who have a too powerful computer.
         if (i> 0 ) {t= GetMicrosecondCount ()-t; sum+=t; f++; 
         C. TextOut (Width/ 2 ,Height/ 2 , "Время формирования кадра = " + IntegerToString (sum/f)+ " мкс" , clrBlueViolet , TA_CENTER | TA_VCENTER );}
         C.Update();
         t= GetMicrosecondCount ();
         for (w= 0 ;w<N;w++)
           {
            XP[w]= Width/ 2 -( sin (( double )j/k[ 2 *w])*( double )Width/ 2 );
            YP[w]= Height/ 2 -( cos (( double )j/k[ 2 *w+ 1 ])*( double )Height/ 2 );
           }
         j++;
        }
       int X=pos%Width;
       int Y= int (pos/Width);
      
     // for(int w=0;w<N;w++) D1[w]=SQRT[int((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y))];
       for (w= 0 ;w<N;w++) D[w]=     sqrt ((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y));
       double S1= 0 ,S2;
       for (w= 0 ;w<N/ 2 ;w++) S1+=D[w];
      S2=S1;
       for (w=N/ 2 ;w<N;w++) S2+=D[w];
       double d=S1/S2;
      
       //double d= (D[0]+D[1]+D[2]+D[3])/(D[0]+D[1]+D[2]+D[3]+D[4]+D[5]+D[6]+D[7]);
       //d= (D[0]+D[1])/(D[0]+D[1]+D[2]+D[3]);
      C.m_pixels[pos]=XRGB(h[ int (d* 11520 )],h[ int (d* 17920 )],h[ int (d* 6400 )]); // works a little faster, but requires transferring the array m_pixels from protected to public in Canvas.mqh
       //C.PixelSet(X,Y,XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]));
      i++;
     }
   C.Destroy();
  }
//+------------------------------------------------------------------+
 
Nikolai Semko :

MT4와 MT5의 차이점을 이해하기 위해 이 코드를 두 플랫폼 모두에서 실행하면(코드가 여기 저기에서 작동함) MT4에서 훨씬 느리게 작동한다는 것을 알 수 있습니다.

네, 여기 저기에 두었습니다. 10배 정도 차이가 난다. 정확히는 MT5에서 어레이가 10배 이상 빠르게 초기화되기 때문입니다. 나는 확인했다.

그러나 MT4에서도 모든 것이 훨씬 빨라야 합니다. 결국, 당신은 단지 이미지를 다시 그리는 것입니다. 또 다른 것은 배열에서 반복적으로 처리하는 경우입니다.

MT4에서 왜 그렇게 느리게 작동하는지 모르겠습니다.

 

그러나 그래프 크기 캔버스의 전체 공간에서 모든 픽셀을 다시 초기화할 수 있습니다.

애니메이션 에서는 특정 영역만 그려지고 이미지의 주요 부분은 리소스에서 완전히 가져옵니다. 당신은 주요 부분이없고 이미지가 완전히 생성됩니다. 따라서 속도가 느려집니다.

사진의 크기 정도입니다.

 
Реter Konow :

그러나 그래프 크기 캔버스의 전체 공간에서 모든 픽셀을 다시 초기화할 수 있습니다.

내 애니메이션에서는 특정 영역만 그려지고 이미지의 주요 부분은 전체 리소스에서 가져옵니다. 당신은 주요 부분이없고 이미지가 완전히 생성됩니다. 따라서 속도가 느려집니다.

사진의 크기 정도입니다.

무슨 상관이야. 이것은 캔버스 속도에서 MT5의 장점을 명확하게 보여주는 특히 극단적인 예입니다. 그리고 이 질문은 당신의 자손에게 기록되어 있습니다. 따라서 나는 오랫동안 MQL5로 전환하라고 말해왔다.
사실이 남아 있습니다. mt5의 이미지 프레이밍은 mt4보다 10배 빠릅니다. 그리고 이것은 매우 강력한 주장입니다.
 
Nikolai Semko :
무슨 상관이야. 이것은 캔버스 속도에서 MT5의 장점을 명확하게 보여주는 특히 극단적인 예입니다. 그리고 이 질문은 당신의 자손에 보관됩니다. 따라서 나는 오랫동안 MQL5로 전환하라고 말해왔다.
사실이 남아 있습니다. mt5의 이미지 프레이밍은 mt4보다 10배 빠릅니다. 그리고 이것은 매우 강력한 주장입니다.

단점 MT4 - 개발에 필요한 것. 당신은 그들에게서 도망칠 필요가 없습니다. 그들은 당신이 생각하고 솔루션을 개선하게 만듭니다.

MT5에서는 너무 열심히 노력할 필요가 없습니다. 모든 것이 너무 빨리 작동합니다. 따라서 MT5로의 전환은 결승전에서 예정되어 있습니다.

 
Реter Konow :

마지막으로 동적 테이블이 완료되었습니다. 나는 그것이 쉽지 않았다고 말해야 한다. 많은 뉘앙스가 있음이 밝혀졌습니다.

또한 이 테이블은 "조건부" 동적입니다. 즉, 최대 행 수가 미리 정해져 있다. "절대적으로" 동적으로 만드는 것은 아직 불가능합니다.

이 테이블에는 20개의 가능한 행이 있습니다. 이는 20개의 열린 위치를 표시할 수 있음을 의미합니다. 더 많은 작업을 수행할 수 있지만 현재로서는 이것은 시연에 불과합니다.

보려면 클릭하세요.

다음은 연결 파일(include에 있음), 엔진(indicator 폴더에 있음) 및 test.advisor(experst 폴더에 있음)입니다.

Peter, 미안하지만 당신의 일은 받아들여지지 않습니다. 왜냐하면. 당신이 보낸 것은 드문 해킹입니다. 죄송하지만 보내주신 내용을 실행한 사람은 저뿐이며 검사는 저 외에는 아무도 하지 않는 것 같습니다.

따라서 순서대로 작업은 다음과 같습니다.

가격 , 방향, 이익이 있는 가장 간단한 테이블을 표시합니다. 나머지는 당신에게 달려 있습니다. 가장 중요한 것은 주문을 마감하면 테이블의 해당 표시도 사라진다는 것입니다. 그 반대의 경우도 마찬가지입니다. 새 주문을 열 때 이 테이블에 나타납니다.

대신 내가 보는 것:

첫째, 거래는 구매/판매 버튼을 클릭해야만 패널에서 열 수 있습니다. 표준 창을 통해 포지션을 열면 거래가 나타나지 않습니다.

둘째, 일부 주문은 빈 값으로 표시됩니다. 테이블에 있지만 행이 비어 있습니다.

셋째, (이것은 일반적으로 공포입니다) 표준 대화 상자를 통해 주문을 닫으면 테이블에서 사라지지 않습니다. 그러나 가장 슬픈 것은 패널을 다시 로드할 때 마감된 주문이 다시 열린 것으로 표시된다는 것입니다! 그것은 무엇입니까? 무의미한 정보를 어딘가에 저장했다가 불러오려고 하는 이유는!?

넷째, 20주문은 도대체 무엇인가? 내 임무에는 이 제한에 대한 단어가 없습니다! 이것은 동적이고 이전에 알려지지 않은 환경에서 작업하기 위해 엔진을 테스트하기 위해 의도적으로 수행되었습니다. 작업은 우연히 선택되지 않았으며 엔진의 모든 "예리한 모서리"를 숨기는 방식으로 내 요구 사항을 변경했습니다. 그러나 이러한 날카로운 모서리를 보여주기 위해 작업이 주어졌습니다.

다섯째, 손절매를 설정하고 이익을 취하는 아마추어 성능 - 하지 마십시오. 이 필드는 비워 둡니다.

그리고 네, 패널의 닫기 위치 버튼(십자형)도 작동하지 않습니다.

한마디로 피터 다시 말하지만, 당신이 보낸 것은 완전한 쓰레기입니다. 사양에 맞게 수정해주세요.

질문이 없도록 작업을 다시 명확히하겠습니다.

  1. 테이블은 동적이며 거래 탭과 동일한 주문을 보여줍니다. 탭에 주문이 없으면 테이블에도 없는 것입니다.
  2. 테이블에 표시된 주문의 수는 임의여야 합니다. 상한선은 없습니다.
  3. 표준 대화 상자를 통해 주문을 열면 테이블에 주문이 나타나야 합니다. 표준 수단으로 주문을 마감하면 테이블에서 주문이 사라집니다.
  4. 불일치 상태는 허용되지 않습니다 ! 테이블에 한 가지 항목이 표시되고 거래 탭에 다른 항목이 표시되면 실수입니다.

지방이 실패할 때까지 . 귀하의 개선을 기대합니다. 그리고 당신이 그것을 알아낼 때까지 어떤 3D도 렌더링되지 않습니다!