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

 

저는 가속화된 데이터 처리에 우선순위를 두고 MT4의 Expert Advisor를 위해 TOR를 작성하고 있습니다.

작업 속도를 높이는 데 계산 또는 선택(정확한 이름이 무엇입니까? 대표자)의 실행 순서가 중요한지 여부를 알려주시기 바랍니다.

블록 다이어그램을 보여주는 두 가지 옵션을 그림 형식으로 첨부합니다.

가능하다면 블록의 선택적 실행이 발생하는 경우 코드가 어떻게 생겼는지 작성하십시오. 순전히 원시적인 레이아웃이며 속도가 크게 향상됩니다!?

파일:
Logic_V_01.png  26 kb
Logic_V_02.png  30 kb
 
void OnStart()
{
        uchar max=0;
        for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
        for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает
        for(int t=0;t<ULONG_MAX;t++)  {max++;}    //так нет предупреждения и цикл не пашет
        Print("Done!");
}
 

테스터에서 그러한 포지션의 폐쇄는 어떻게 설명됩니까? 확산 확장?

MetaTrader 거래 플랫폼의 스크린샷

EURUSD, M20, 2014.04.12

알파 포렉스, 메타 트레이더 5, 리얼

임시 파일_스크린샷_63279.png

EURUSD, M20, 2014.04.12, Alfa-Forex, MetaTrader 5, Real


 
Crucian :

테스터에서 그러한 포지션의 폐쇄는 어떻게 설명됩니까? 확산 확장?

[img]https://charts.mql5.com/4/434/eurusd-m20-alfa-foreks-temp-file-screenshot-63279-png.png[/img]

스프레드의 확장이 있었다면(그리고 화면으로 판단 - 720 포인트! 5자리) 모든 것이 정확합니다.

매도 포지션은 매도호가에서 마감되었습니다. 발이 노출된 경우입니다.

그건 그렇고, 귀하의 중개인 Alfa-Forex는 주말과 초반에 엄청난 스프레드를 가지고 있습니다.

그들은 아마도 시세의 이력을 입력했고 테스터는 이에 대한 거래를 시뮬레이션했습니다.

주말에 정류장을 떠나는 것은 위험합니다. 여전히 갭에서 당신을 구할 수 없으며 확산 확장을 쉽게 잡을 수 있습니다.

 
Fleder :
 for ( int t= 0 ;t< LONG_MAX + 1 ;t++) {max++;}     //так предупреждение есть, но цикл не работает

LONG_MAX + 1 < 0 이므로 여기에 오류가 없습니다.

 for ( int t= 0 ;t< LONG_MAX ;t++)   {max++;}     //так получаем предупреждение expression is always true, цикл работает
여기서 경고가 정당화됩니다(t가 int인 경우 t< LONG_MAX 는 항상 true임). 무한 루프
 
void OnStart()
{
  uchar max=0;
  for(int t=0;t<ULONG_MAX-1e0;t++)  {max++;}      //так цикл работает, предупреждения нет так как ULONG_MAX-1e0 имеет тип double
  for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
  Print("Done!");
}
 
Fleder :
 for ( int t= 0 ;t< ULONG_MAX - 1 ;t++)    {max++;}       //а так нет и предупреждения тоже нет
ULONG_MAX - 1 < 0, 즉 비교 작업에서 int 또는 long으로 캐스팅됩니다. 더 정확하게는 비트 비교가 있습니다.
 
A100 :
ULONG_MAX - 1 < 0이므로 오류가 없습니다. 비교 작업에서 int로 캐스트하기 때문입니다.

그런 다음 그것을 설명하는 방법:

 void OnStart ()
{
   long t= 0 ;
   bool comp=( ULONG_MAX - 1 >t);
   Print ( "comp = " ,comp);   //comp = true
   Print ( ULONG_MAX - 1 );       //18446744073709551614
   Print ( ULONG_MAX );         //18446744073709551615
}
 
A100 :
ULONG_MAX - 1 < 0, 즉 비교 연산에서 int 또는 long으로 캐스트

루프에서 확인된 표현식의 비교를 의미합니까?

단순 비교에서는 그렇지 않은 것처럼 보이기 때문입니다.

 
A100 :

그냥 교환하세요 :)

그리고 이 순열은 무엇을 제공합니까? t는 ULONG_MAX -1보다 작으므로 동일하게 유지되었다.

 void OnStart ()
{
   long t= 0 ;
   Print ( (t < ULONG_MAX - 1 ) == ( ULONG_MAX - 1 < t)); //false
}