오류, 버그, 질문 - 페이지 2164

 
Vladimir Pastushak :

제품 설명 에 공간이 거의 없습니다.

3600자는 크고 심각한 프로그램의 경우 매우 작습니다.

많은 분들이 공감하실 거라 생각합니다.

프로그램을 설명하려면 최소 5000~10000자가 필요합니다. 글쎄, 또는 프로그램 설정의 이름이있는 마지막 탭에서

중재자는 항상 물을 제거하도록 요청할 수 있습니다.

지금은 프로그램에 대한 설명을 작성하고 있으며 3600자를 모두 사용하여 설정을 설명할 뿐이고 가능성의 절반도 설명하지 않았습니다...

블라디미르, 물건을 산 적이 있습니까? 지침을 읽는 데 얼마나 많은 시간을 보냈습니까?

아무도 여러 권으로 된 탈무드를 읽지 않을 것이며 3-5분이 넘는 비디오라도 시청하지 않을 것입니다.
이제 거의 모든 곳에서 수행되므로 프로그램 인터페이스에서 힌트를 만드는 방법은 하나뿐입니다. 일종의 대화형 소개와 같습니다. 고급 사용자를 위한 자세한 지침은 블로그나 웹사이트에 게시할 수 있습니다. 찾고 다운로드하려는 사람.

 
Vladimir Pastushak :

제품 설명 에 공간이 거의 없습니다.

3600자는 크고 심각한 프로그램의 경우 매우 작습니다.

많은 분들이 공감하실 거라 생각합니다.

프로그램을 설명하려면 최소 5000~10000자가 필요합니다. 글쎄, 또는 프로그램 설정의 이름이있는 마지막 탭에서

중재자는 항상 물을 제거하도록 요청할 수 있습니다.

지금은 프로그램에 대한 설명을 작성하고 있으며 3600자를 모두 사용하여 설정을 설명할 뿐이고 가능성의 절반도 설명하지 않았습니다...

나는 동의하지 않는다. 간결함은 재치의 영혼입니다.

"당신의 장황한 말에 당신이 들릴 것이라고 생각하지 마십시오."

매트. 6:7

 
Andrey Khatimlianskii :

블라디미르, 물건을 산 적이 있습니까? 지침을 읽는 데 얼마나 많은 시간을 보냈습니까?

아무도 여러 권으로 된 탈무드를 읽지 않을 것이며 3-5분이 넘는 비디오라도 시청하지 않을 것입니다.
이제 거의 모든 곳에서 수행되는 것처럼 프로그램 인터페이스에서 힌트를 만드는 한 가지 방법이 있습니다. 일종의 대화형 소개와 같습니다. 고급 사용자를 위한 자세한 지침은 블로그나 웹사이트에 게시할 수 있습니다. 원하는 사람 - 찾고 다운로드하십시오.

읽지도 않고 사지도 않는 분들, 물건의 용도도 모르고 물건을 많이 구입하셨나요?

그러면 모두 블로그에 게시할 수 있습니까?

 
Nikolai Semko :

나는 동의하지 않는다. 간결함은 재치의 영혼입니다.

"당신의 장황한 말에 당신이 들릴 것이라고 생각하지 마십시오."

매트. 6:7

동의합니다만 짧게 3600도 부족합니다...

 
Vladimir Pastushak :

읽지도 않고 사지도 않는 분들, 물건의 용도도 모르고 물건을 많이 구입하셨나요?

그러면 모두 블로그에 게시할 수 있습니까?

지침에서 제품의 목적을 이해합니까?

우둔. 나는 데모를 다운로드하고 느낀다.

 
A100 :

위의 코드는 컴파일러 결함을 기반으로 합니다.

결과: 1... 왜 2가 아닌가요?

C++는 컴파일할 때 오류를 보고하지만 두 함수 모두 분명히 적합하고 게다가 구문에서는 함수를 명시적으로 호출 할 수 없습니다. (2)

또한 MQL의 특성을 감안할 때 정확히 반대를 수행하는 것이 더 논리적일 것입니다. 매개변수 전달의 우선순위를 값으로 설정하는 것이 아니라(현재와 같이) const 참조로 설정하는 것입니다(이의 장점은 특히 문자열의 예)

 void f(       string   ) { Print ( __FUNCSIG__ ); } //1
void f( const string & ) { Print ( __FUNCSIG__ ); } //2
string g() { return "ABCDEF4" ; }
void OnStart ()
{
           string text1 = "ABCDEF1" ;
     const string text2 = "ABCDEF2" ;
//  вызываемая функция: сейчас  предлагается
    f( text1 );     //    1       2               
    f( text2 );     //    *       2 потому что const или оставить *
    f( "ABCDEF3" ); //    1       1
    f( g());         //    1       1
//Примечание: * - неопределенность
}

참조로 수행할 수 있는 경우 값으로 긴 문자열을 전달(실제로 복사)하는 이유는 명확하지 않습니다.

 

컴파일 중 오류

 #import   "Test.dll" //Error: '#import' - #import was not closed
#include "Test.h"
#import
 //Test.h
void f();

포함할 수만 있다면 .h 파일의 내용을 수동으로 전송하는 이유는 무엇입니까(특히 주기적으로 변경될 수 있기 때문에)?

 

좋은 오후, 말해주세요:

로컬 네트워크 팜 또는 MQL5 클라우드 네트워크를 사용할 때 파일에 최적화 결과 를 쓰는 방법은 무엇입니까?

OnTester()에는 다음을 사용하는 절차가 있습니다.

 string toWrite = "test" ;
fileHandle= FileOpen (fileName, FILE_CSV | FILE_READ | FILE_WRITE | FILE_ANSI | FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_COMMON , "," );
FileWrite (fileHandle,toWrite);
FileClose (fileHandle);

로컬 에이전트 사용 시 공유 폴더에 최적화 결과가 있는 파일이 생성되며, 로컬 네트워크 팜 또는 MQL5 클라우드 네트워크 사용 시 파일이 존재하지 않습니다.

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 
Nikolai Semko : 무엇이 잘못되었나요? 브레이크는 어디에서 왔습니까?

확인 결과:

  1. 직접 CPU 명령어에 매핑된 SQRT

  2. SQRT + 수학적 계산 은 분기 없이 진행되며 하나의 명령(128비트 데이터)에 대해 두 개의 근이 한 번에 계산됩니다.

    이 코드는 다음 어셈블러 SSE 코드로 바뀝니다.
             D1= sqrt ((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));
             D2= sqrt ((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
             D3= sqrt ((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));
             D4= sqrt ((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));
             D5= sqrt ((X5-X)*(X5-X)+(Y5-Y)*(Y5-Y));
             D6= sqrt ((X6-X)*(X6-X)+(Y6-Y)*(Y6-Y));
             D7= sqrt ((X7-X)*(X7-X)+(Y7-Y)*(Y7-Y));
             D8= sqrt ((X8-X)*(X8-X)+(Y8-Y)*(Y8-Y));
            ...
             sqrtsd   xmm1, xmm1
            unpcklpd        xmm4, xmm4
            movapd  xmm3, xmmword ptr [rsp + 432 ]
            unpcklpd        xmm3, xmmword ptr [rsp + 384 ]
            subpd   xmm3, xmm4
            mulpd   xmm3, xmm3
            unpcklpd        xmm0, xmm0
            movapd  xmm5, xmmword ptr [rsp + 416 ]
            unpcklpd        xmm5, xmmword ptr [rsp + 400 ]
            subpd   xmm5, xmm0
            mulpd   xmm5, xmm5
            addpd   xmm5, xmm3
            sqrtpd   xmm8, xmm5
            movapd  xmm5, xmmword ptr [rsp + 464 ]
            subpd   xmm5, xmm4
            mulpd   xmm5, xmm5
            movapd  xmm7, xmm9
            subpd   xmm7, xmm0
            mulpd   xmm7, xmm7
            addpd   xmm7, xmm5
            movapd  xmm6, xmm10
            unpcklpd        xmm6, xmm11
            subpd   xmm6, xmm4
            movapd  xmm3, xmmword ptr [rsp + 368 ]
            unpcklpd        xmm3, xmmword ptr [rsp + 352 ]
            subpd   xmm3, xmm0
            movapd  xmm4, xmm8
            shufpd  xmm4, xmm4, 1
            sqrtpd   xmm5, xmm7
            mulpd   xmm6, xmm6
            mulpd   xmm3, xmm3
            addpd   xmm3, xmm6
            sqrtpd  xmm15, xmm3
            movapd  xmm0, xmm14
            unpcklpd        xmm0, xmmword ptr [rsp + 336 ]
            subpd   xmm0, xmm2
            mulpd   xmm0, xmm0
            movapd  xmm2, xmm0
            shufpd  xmm2, xmm2, 1
            addsd   xmm2, xmm0
            movapd  xmm0, xmm15
            shufpd  xmm0, xmm0, 1
             sqrtsd   xmm12, xmm2
    이것은 결국 예술 작품입니다. 어셈블러 명령어의 4번 호출에 대해 8개의 루트가 계산됩니다. 한 번의 호출로 두 개의 이중 숫자가 계산되었습니다.

  3. 배열을 통한 작업 중에 이중 -> 정수 인덱스 변환에 대한 검사, 분기 및 손실과 함께 모든 것이 정상적으로 진행됩니다.

  4. 이 예에서 어레이로 작업할 때 FPU/ALU가 지속적으로 혼합되어 성능에 매우 나쁜 영향을 미칩니다.

  5. 동적 어레이에 대한 액세스 최적화는 칭찬을 넘어 탁월합니다. 그러나 FPU/ALU 연산을 혼합 + 이중 변환 -> 정수 + 분기는 시간을 낭비합니다.

일반적인 결론: MQL5의 수학은 완벽한 최적화 덕분에 승리했습니다. 지는 것은 배열이 아니라 수학이 이깁니다.

 

다음은 완전한 최적화가 적용된 동일한 Visual C ++ 2017 x64 코드에서 수행한 음란물입니다.

; 52    :       int X=pos%Width;
; 53    :       int Y= int (pos/Width);
; 54    :       
; 55    :       D1= sqrt ((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));

   0046 f 0 f 28 c8         movaps  xmm1, xmm0
   00472 8 b c3            mov     eax, ebx
   00474 99                cdq
   00475 45 0 f 57 db      xorps   xmm11, xmm11
   00479 f7 ff            idiv    edi
   0047 b 0 f 57 f6         xorps   xmm6, xmm6
   0047 e 41 0 f 28 c4      movaps  xmm0, xmm12
   00482 f2 44 0 f 2 a d8   cvtsi2sd xmm11, eax
   00487 f2 0 f 2 a f2      cvtsi2sd xmm6, edx
   0048 b f2 41 0 f 5 c cb   subsd   xmm1, xmm11
   00490 f2 0 f 5 c c6      subsd   xmm0, xmm6
   00494 f2 0 f 59 c9      mulsd   xmm1, xmm1
   00498 f2 0 f 59 c0      mulsd   xmm0, xmm0
   0049 c f2 0 f 58 c1      addsd   xmm0, xmm1
   004 a0 e8 00 00 00 00    call     sqrt

; 56    :       D2= sqrt ((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
; 57    :       D3= sqrt ((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));

   004 a5 41 0 f 28 cf      movaps  xmm1, xmm15
   004 a9 41 0 f 28 c6      movaps  xmm0, xmm14
   004 ad f2 0 f 5 c c6      subsd   xmm0, xmm6
   004 b1 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
   004 b6 f2 0 f 59 c0      mulsd   xmm0, xmm0
   004 ba f2 0 f 59 c9      mulsd   xmm1, xmm1
   004 be f2 0 f 58 c1      addsd   xmm0, xmm1
   004 c2 e8 00 00 00 00    call     sqrt

; 58    :       D4= sqrt ((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));

   004 c7 f2 0 f 10 8 c 24
         90 01 00 00       movsd   xmm1, QWORD PTR Y4$ 1 $[rsp]
   004 d0 f2 0 f 10 84 24
         98 01 00 00       movsd   xmm0, QWORD PTR X4$ 1 $[rsp]
   004 d9 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
   004 de f2 0 f 5 c c6      subsd   xmm0, xmm6
   004 e2 f2 0 f 59 c9      mulsd   xmm1, xmm1
   004 e6 f2 0 f 59 c0      mulsd   xmm0, xmm0
   004 ea f2 0 f 58 c1      addsd   xmm0, xmm1
   004 ee e8 00 00 00 00    call     sqrt

; 59    :       D5= sqrt ((X5-X)*(X5-X)+(Y5-Y)*(Y5-Y));
; 60    :       D6= sqrt ((X6-X)*(X6-X)+(Y6-Y)*(Y6-Y));
; 61    :       D7= sqrt ((X7-X)*(X7-X)+(Y7-Y)*(Y7-Y));
; 62    :       D8= sqrt ((X8-X)*(X8-X)+(Y8-Y)*(Y8-Y));

   004 f3 f2 0 f 10 44 24
         20                movsd   xmm0, QWORD PTR X8$ 1 $[rsp]
   004 f9 41 0 f 28 c8      movaps  xmm1, xmm8
   004 fd f2 0 f 5 c c6      subsd   xmm0, xmm6
   00501 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
   00506 f2 0 f 59 c0      mulsd   xmm0, xmm0
   0050 a f2 0 f 59 c9      mulsd   xmm1, xmm1
   0050 e f2 0 f 58 c1      addsd   xmm0, xmm1
   00512 e8 00 00 00 00    call     sqrt
   00517 f2 0 f 10 4 c 24
         28                movsd   xmm1, QWORD PTR Y2$ 1 $[rsp]
   0051 d 41 0 f 28 c5      movaps  xmm0, xmm13
   00521 f2 44 0 f 10 44
         24 30             movsd   xmm8, QWORD PTR Y5$ 1 $[rsp]
   00528 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
   0052 d f2 44 0 f 10 54
         24 40             movsd   xmm10, QWORD PTR Y6$ 1 $[rsp]
   00534 f2 0 f 5 c c6      subsd   xmm0, xmm6
   00538 f2 44 0 f 10 64
         24 50             movsd   xmm12, QWORD PTR Y7$ 1 $[rsp]
   0053 f f2 45 0 f 5 c c3   subsd   xmm8, xmm11
   00544 f2 0 f 10 7 c 24
         38                movsd   xmm7, QWORD PTR X5$ 1 $[rsp]
   0054 a f2 45 0 f 5 c d3   subsd   xmm10, xmm11
   0054 f f2 44 0 f 10 4 c
         24 48             movsd   xmm9, QWORD PTR X6$ 1 $[rsp]
   00556 f2 45 0 f 5 c e3   subsd   xmm12, xmm11
   0055 b f2 44 0 f 10 5 c
         24 58             movsd   xmm11, QWORD PTR X7$ 1 $[rsp]
   00562 f2 0 f 5 c fe      subsd   xmm7, xmm6
   00566 f2 0 f 59 c0      mulsd   xmm0, xmm0
   0056 a f2 44 0 f 5 c ce   subsd   xmm9, xmm6
   0056 f f2 0 f 59 c9      mulsd   xmm1, xmm1
   00573 f2 44 0 f 5 c de   subsd   xmm11, xmm6
   00578 f2 0 f 58 c1      addsd   xmm0, xmm1
   0057 c e8 00 00 00 00    call     sqrt
   00581 f2 0 f 59 ff      mulsd   xmm7, xmm7
   00585 f2 45 0 f 59 c0   mulsd   xmm8, xmm8
   0058 a f2 41 0 f 58 f8   addsd   xmm7, xmm8
   0058 f 0 f 28 c7         movaps  xmm0, xmm7
   00592 e8 00 00 00 00    call     sqrt
   00597 f2 45 0 f 59 c9   mulsd   xmm9, xmm9
   0059 c f2 45 0 f 59 d2   mulsd   xmm10, xmm10
   005 a1 f2 45 0 f 58 ca   addsd   xmm9, xmm10
   005 a6 41 0 f 28 c1      movaps  xmm0, xmm9
   005 aa e8 00 00 00 00    call     sqrt
   005 af f2 45 0 f 59 db   mulsd   xmm11, xmm11
   005 b4 f2 45 0 f 59 e4   mulsd   xmm12, xmm12
   005 b9 f2 45 0 f 58 dc   addsd   xmm11, xmm12
   005 be 41 0 f 28 c3      movaps  xmm0, xmm11
   005 c2 e8 00 00 00 00    call     sqrt
   005 c7 f2 0 f 10 84 24
         88 01 00 00       movsd   xmm0, QWORD PTR Y1$ 1 $[rsp]

; 63    : 
; 64    :       double d= fabs (D1+D3+D4+D8)/(D1+D2+D3+D4+D5+D6+D7+D8);

MQL5에서 생성된 코드에 대한 무조건 다중 병합.

놀랍게도 MSVC는 최적화 시도조차 하지 않습니다. 마치 20년 된 프로세서를 위해 작성하는 것처럼 라이브러리를 통해 모든 수학을 구동합니다. 그리고 AVX 명령 세트를 포함해도 컴파일러의 동작은 전혀 변경되지 않습니다.

테스트 C++ 파일이 첨부되었습니다. "테스트 예제의 오류"에 대한 생각은 표현되어서는 안되며 오류는 없습니다.

파일:
Test.cpp.zip  1 kb