MQL5에는 항상 위업을 위한 장소가 있습니다! ;)

 

나는 여기에서 다음과 같이 모든 종류의 mql5 "불가능"을 게시하고 분석할 것을 제안합니다. 조건부 컴파일 .

당신은 호기심 많은 사람들을 괴롭히고 독자의 창의력을 자극하기 위해 먼저 기능을 보여줄 수 있습니다( 구현을 공개하지 않고 ).

그러나 궁극적으로 비밀을 밝히고 샘플 구현을 제공하는 것이 필요합니다(필수!).

물론 이러한 "2단계" 형식은 사기로 가득 차 있지만 "바자회에 응답"할 준비가 된 마법사의 정직한 진술에 의존할 것입니다. :)

--

그래서........... 시작!

 
Итак........ НАЧАЛИ !

잘. 내가 처음이야. :)

대부분의 "마법 같은" 장소는 다소 느린 것이 사실입니다. 하지만... mql5 마법사 중 한 명이 나중에 속도를 높일 수 있는 방법을 찾을 수 있을까요?

// 속도가 얼마나 느려지는지 직접 확인할 수 있습니다. 테스트는 작업 속도를 측정하는 데만 사용됩니다.

이 코드는 2차원 배열을 사용하는 일반적인 구문에 따라 작동합니다.

 void OnStart ()
  {
   float   FA[ 5 ][ 3 ];
   long st= GetTickCount ();
   for ( int t= 0 ;t< 1000000 ;t++)
     {
       for ( int i= 0 ;i< 5 ;i++)
        {
         for ( int j= 0 ;j< 3 ;j++)
           {
            FA[i][j] = (i+ 1.5 )*(j+ 1.3 );
           }
        }
     }
   Print ( "====" , GetTickCount ()-st, " ms ====" );
   
   st= GetTickCount ();
   C2DMagicArray  MA( 5 , 3 );   
   for ( int t= 0 ;t< 1000000 ;t++)
     {
       for ( int i= 0 ;i<MA.SizeL();i++)
        {
         for ( long j= 0 ;j<MA.MaxR();j++)
           {
             MA[i][j] = (i+ 1.5 )*(j+ 1.3 );  
             // ^  ^  Как это сделано ??? Можете повторить ? :))
           }
        }
     }
   Print ( "====" , GetTickCount ()-st, " ms ====" );
   st= GetTickCount ();
   for ( int t= 0 ;t< 1000000 ;t++)
     {
       for ( int i= 0 ;i<MA.SizeL();i++)
        {
         for ( long j= 0 ;j<MA.MaxR();j++)
           {
            MA.Set(i,j, float ((i+ 1.5 )*(j+ 1.3 )));
           }
        }
     }
   Print ( "====" , GetTickCount ()-st, " ms ====" );

   for ( int i= 0 ;i<MA.SizeL();i++)
     {
       for ( int j= 0 ;j<MA.MaxR();j++)
        {
         Print ( MA[i][j] );  
         //         ^  ^    Как это сделано???  :))  Жду Вашу версию !
        }
     }
  }

아직 코드를 컴파일할 수 없습니다. 포함 프로그램은 나중에... - 그렇지 않으면 그다지 흥미롭지 않을 것입니다. :)

그렇다면 누가 위업을 반복할 수 있습니까?

 

블라디미르가 우리의 답변을 기다리는 동안 나도 한 가지 위업에 해당하는 질문이 있습니다.)


하나의 ex5에서 32개 및 64개 DLL에서 함수를 가져오려면 어떻게 해야 합니까?
따라서 2개의(32/64) 터미널에 대해 하나의 ex5를 만든다고 가정해 보겠습니다.


Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 
sergeev :

블라디미르가 우리의 답변을 기다리고 있는 동안, 나는 또한 위업에 가치가 있는 질문이 있습니다;)


하나의 ex5에서 32개 및 64개 DLL에서 함수를 가져오려면 어떻게 해야 합니까?
따라서 2개의(32/64) 터미널에 대해 하나의 ex5를 만든다고 가정해 보겠습니다.

다시 예외를 요청합니까?
 
Urain :
다시 예외를 요청합니까?

아니요, 예외를 요청한 적이 없습니다. 그리고 그것은 아마도 그들에 관한 것이 아닙니다. #ifdef 에 더 가깝습니다.

블라디미르가 코드 로 작업의 오버로드를 마무리할 수 있다면 그의 방법이 필요한 DLL o_O를 자동으로 포함하는 데 적합할 수 있기를 바랍니다.

#define 내부의 일종의 #가져오기

 
MetaDriver :

잘. 내가 처음이야. :)

그렇다면 누가 위업을 반복할 수 있습니까?

문서에 비슷한 예가 나와 있지만 무언가가 오랜 시간 동안 위업을 반복하지 않습니다.

 //--- перебираем строки для сложения
   for ( int i= 0 ;i<rows;i++)
     {
       //--- запишем результаты сложений строк матриц в массив
       for ( int k= 0 ;k<cols;k++)
        {
         arr[k]= this [i][k]+m[i][k];
        }
       //--- поместим массив в строку матрицы
      res[i]=arr;
     }
 
Yurich :

문서에 비슷한 예가 나와 있지만 무언가가 오랜 시간 동안 위업을 반복하지 않습니다.

글쎄,이 유추에 따라 ... 비즈니스 뭔가! ... :-))

그리고 살펴보겠습니다. ;)

 
sergeev :

하나의 ex5에서 32개 및 64개 DLL에서 함수를 가져오려면 어떻게 해야 합니까?
따라서 2개의(32/64) 터미널에 대해 하나의 ex5를 만든다고 가정해 보겠습니다.

함수의 이름은 다르게 지정됩니다. 그리고 코드에서 터미널의 비트에 따라 조건부 호출을 넣고 다른 기능에 액세스합니다.

터미널이 첫 번째 호출에서 DLL을 로드하는 것 같습니다. 전화 없음 - 다운로드 시도 없음 및 심각한 유산.

아직 다른 방법이 보이지 않습니다. 터미널 비트 수는 TerminalInfoInteger()를 반환합니다.

 bool x64 = TerminalInfoInteger (TERMINAL_X64);

이 모든 작업은 MyLib.ex5 라이브러리에서 직접 수행할 수 있습니다.



void MyLibMultibitFunc()   // библиотечная универсальная обёртка для DLL-функции
{
   if (x64) { MyDll64Func(); }
   else { MyDll32Func(); }
}
 
MetaDriver :

함수의 이름은 다르게 지정됩니다. 그리고 코드에서 터미널의 비트에 따라 조건부 호출을 넣고 다른 기능에 액세스합니다.

터미널이 첫 번째 호출에서 DLL을 로드하는 것 같습니다. 전화 없음 - 다운로드 시도 없음 및 심각한 유산.

아직 다른 방법이 보이지 않습니다. 터미널 비트 수는 TerminalInfoInteger()를 반환합니다.

이 모든 작업은 MyLib.ex5 라이브러리에서 직접 수행할 수 있습니다.

예, 터미널이 첫 번째 호출에서만 dll 함수 개체를 생성한다는 의견도 있습니다.

비트에 관해서는 포럼에서 숫자의 다른 표현에 대한 언급이 있었던 것 같습니다. 변경이 있는 비트 필드가 하나의 결과를 제공하면 32가 될 것이고 다른 하나는 64가 될 것입니다. 경험적으로 결정할 수 있습니다.

 
MetaDriver :

함수의 이름은 다르게 지정됩니다. 그리고 코드에서 터미널의 비트에 따라 조건부 호출을 넣고 다른 기능에 액세스합니다.

터미널이 첫 번째 호출에서 DLL을 로드하는 것 같습니다. 전화 없음 - 다운로드 시도 없음 및 심각한 유산.

아니요, 여러분, 당신은 문제를 이해하지 못합니다. TERMINAL_X64 또는 _Is64의 가능성이 알려져 있습니다.

그러나 불행히도 터미널은 다릅니다.

- 차트에 던질 때 사용된 DLL 목록을 확인하고 Dependencies 창 에 가져온 함수 목록을 표시합니다.
비트 수와 일치하지 않는 DLL에서 경고 MQL5\Libraries\somedll64.dll' is not 32-bit version 을 씁니다.

- 그런 다음 OK를 누르고 Expert Advisor가 시작되면 여기에서 매복이 기다립니다.

터미널에서 오류 193을 제공하고 EX5를 언로드합니다.

'MQL5\Libraries\somedll64.dll'을 열 수 없습니다(193)
EX5 로딩 실패

그리고 코드에는 DLL 선언만 있고 이 선언에서 함수를 가져오지 않는다는 점에 주의하고 싶습니다.

#가져오기 "somedll64.dll"
#수입
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 

그래서 1번 문제가 있습니다.

64 응용 프로그램은 user32.dll 등과 같은 32비트 dll에서 기능을 어떻게 가져 옵니까? 아니면 시스템에 해당 이름을 가진 복사본이 있고 OOP 공간이 생성됩니까?