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

 

개발자에게 질문:

테스터에서 구조 필드를 얻는 것이 불가능한 이유

MqlTrade결과   가격 ; // 브로커가 확인한 거래 가격 ? 0을 줍니다.

데모는 잘 작동합니다.

 
x100intraday :

타임프레임의 목록 구조와 객체 가시성 플래그 사이에 어떤 관계가 있습니까(결국 목록의 길이도 다릅니다: 22 vs 23)? 일반적으로 나는 플래그를 수동으로 나열하고 합산하지 않고 주어진 경계가 있는 주기의 시간 프레임에서 개체의 가시성 을 효과적이고 간결하게 할당하기 위해 요청합니다. 임의의 시간 프레임이 무작위로 취해지고 그 위에 그래픽 개체가 구축되고 현재 시간보다 오래되지 않은 모든 시간 프레임(즉, 빌드된 시간 프레임)에서 가시성을 허용해야 하는 경우 어떤 논리를 사용해야 합니다. )? 알고리즘은 하나의 특정한 경우가 아니라 보편적이어야 합니다. 인덱스별 상관 관계가 있는 경우 - 이미 진행 중이므로 여기에는 인덱스 대응도 없습니다. 이름 문자열 구문 분석 및 비교 - 가시성 상수의 경우 문자열로 작업할 수 없기 때문에 다시 범위에서. 지금까지는 복잡하고 모호하며 매우 비뚤어진 구현이 떠올랐습니다.

물론 관계가 있지만 <visibility_flag>=F(<timeframe>) 를 작성하면 다음과 같이 작동할 정도로 매우 암묵적입니다.

 int PeriodToTimeframeFlag( ENUM_TIMEFRAMES period)
  {
   flags= 0 ;
   static ENUM_TIMEFRAMES _p_int[]={ PERIOD_M1 , PERIOD_M2 , PERIOD_M3 , PERIOD_M4 , PERIOD_M5 , PERIOD_M6 ,
                                     PERIOD_M10 , PERIOD_M12 , PERIOD_M15 , PERIOD_M20 , PERIOD_M30 ,
                                     PERIOD_H1 , PERIOD_H2 , PERIOD_H3 , PERIOD_H4 , PERIOD_H6 , PERIOD_H8 , PERIOD_H12 ,
                                     PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };
//--- cycle for all timeframes
   for ( int i= 0 ;i< ArraySize (_p_int);i++)
       if (period==_p_int[i])
        {
         //--- at the same time generate the flag of the working timeframe
         flags=(( int ) 1 )<<i;
         break ;
        }
   return (flags);
  }
 

x100intraday :

임의의 시간 프레임이 무작위로 취해지고 그 위에 그래픽 개체가 구축 되고 현재 시간보다 오래되지 않은 모든 시간 프레임(즉, 빌드된 시간 프레임)에서 가시성을 허용해야 하는 경우 어떤 논리를 사용해야 합니다. )?

필요한 경우 체커를 사용하지 마십시오)

 ENUM_TIMEFRAMES TF[ 21 ]={ PERIOD_M1 , PERIOD_M2 , PERIOD_M3 , PERIOD_M4 , PERIOD_M5 , PERIOD_M6 , PERIOD_M10 ,
                     PERIOD_M12 , PERIOD_M15 , PERIOD_M20 , PERIOD_M30 , PERIOD_H1 , PERIOD_H2 , PERIOD_H3 ,
                     PERIOD_H4 , PERIOD_H6 , PERIOD_H8 , PERIOD_H12 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };

int Visibility[ 21 ]={ 1 , 3 , 7 , 15 , 31 , 63 , 127 , 255 , 511 , 1023 , 2047 , 4095 , 8191 ,
             16383 , 32767 , 65535 , 131071 , 262143 , 524287 , 1048575 , 2097151 };

TF[i]를 고려하고 Visibility[i]를 설정합니다..

또는 가시성=(int)(MathPow(2,i+1)-1);

 
Swan :

필요한 경우 체커가 아님)

TF[i]를 고려하고 Visibility[i]를 설정합니다..

또는 가시성=(int)(MathPow(2,i+1)-1);

가시성 공식에 감사드립니다. 아마도 어딘가에 적용할 것입니다. 기간의 값을 보면 이것이 무언가의 정도라는 것이 분명했지만, 스스로 수식을 복원하려고 하지는 않았습니다.

-1이 필요합니까? 일반적으로 Visibility[]는 내 생각에 잘못된 값으로 채워져 있지만 실제로는 -1이 없는 모든 곳에 있어야 합니다. 즉, 1, 2, 4, 8, 16 ...

 
uncleVic :

물론 관계가 있지만 <visibility_flag>=F(<timeframe>) 를 작성하면 다음과 같이 작동할 정도로 매우 암묵적입니다.


감사합니다, 우아하게. 이것은 내가 부족했던 교대 자체를 제외하고는 정확히 내가 하려고 했던 것입니다.

그리고 결국 _p_int 시간 프레임 배열에 따라 회귀 주기의 각 반복에서 플래그 값을 계산하는 문제로 실제로 전환했습니다(결국 플래그별로 무언가를 추가해야 할 것입니다) ), 그리고 하나의 현재 하나에만 있는 것이 아닙니다. 글쎄, 우리는 시프트에 의해 현재 TF에 대한 가시성 플래그의 값을 얻었고 매 턴 i - 어딘가에서 무언가가 변경되어야합니다 ... 거기에서 지수 공식을 적용하거나 동일한 시프트 원칙을 사용해야합니다 . 아직 방법을 모르겠어...

...예, 이것은 TF 인수가 있는 함수입니다. 루프에서 비틀어 보겠습니다...

그러나 다시 말하지만 그렇지 않습니다. 이제 설명하겠습니다. 이 예에서 정적 ENUM_TIMEFRAMES _p_int[]는 21개 요소로 설정되지만! 나는 이것을 원한다: 나는 이미 유사한 배열을 가지고 있지만 임의의 길이일 수 있다. 이것은 무언가가 구축될 시간 프레임을 포함하는 배열이지만 모든 하위 시간 프레임에 대한 가시성을 가져야 하며 단일 배열이 별도로 또는 기존 배열과 함께 채워지지 않아야 합니다. 즉, 여기에서 회귀 사이클에서 현재 및 모든 하위 기간의 플래그를 계산하고 합산하기 위해 현재 TF에서 즉석에서 춤을 추는 필요성을 언급합니다. 트릭은 무언가의 사전 정의된 값(적어도 시간 프레임, 최소한 가시성 플래그)의 완전한 배열을 생성하고 이를 양모하는 것이 아니라, 일하다.

해결하는 동안 갈게, 막히면 물어볼게.

 

나는 왜 서두르지 않고 (int)( MathPow (2,i+1)-1) 또는 ((int)1)<<i... i가 있으므로 쉽게 대체할 수 있습니다. 루프 및 실행 ... 그러나 지수의 경우와 시프트의 경우 모두 - 항상 신뢰할 수 있습니까? 그렇지 않으면 개발자가 새로운 시간 프레임을 추가하면 전체 논리가 내리막길을 걸지 않을까요? Offhand - 시프트가 있는 예에서 현재 기간이 미리 정의된 기간과 일치할 것으로 예상합니다.

 if (period==_p_int[i])
따라서 실제의 경우 이론적으로 완전한 시퀀스의 일부 시간 프레임을 건너뛰거나 개발자가 이 시퀀스를 확장하더라도 논리가 크립하지 않아야 합니다. 그러나 우리가 순수한 수학에 의존하고 새로운 시간 프레임의 존재 또는 부재 가능성을 되돌아보지 않고 공식에 따라 경계에서 경계로 순환을 구동하면 조만간 다음 빌드에서 다음을 얻을 수 있습니다. , 비뚤어진...
 
x100intraday :

나는 왜 서두르지 않고 (int)(MathPow(2,i+1)-1) 또는 ((int)1)<<i... i가 있으므로 쉽게 대체할 수 있습니다. 루프 및 실행 ... 그러나 지수의 경우와 시프트의 경우 모두 - 항상 신뢰할 수 있습니까? 그렇지 않으면 개발자가 새로운 시간 프레임을 추가하면 전체 논리가 내리막길을 걸지 않을까요? Offhand - 시프트가 있는 예에서 현재 기간이 미리 정의된 기간과 일치할 것으로 예상합니다.

따라서 실제의 경우 이론적으로 완전한 시퀀스의 일부 시간 프레임을 건너뛰거나 개발자가 이 시퀀스를 확장하더라도 논리가 크립하지 않아야 합니다. 그러나 우리가 순수한 수학에 의존하고 새로운 시간 프레임의 존재 또는 부재 가능성을 되돌아보지 않고 공식에 따라 경계에서 경계로 순환을 구동하면 조만간 다음 빌드에서 다음을 얻을 수 있습니다. , 비뚤어진...

두려움은 아주 잘 근거가 있습니다. 위의 코드는 가시성 플래그 세트가 실제로 매크로임을 정당화합니다.

다음을 통해 작업하는 것이 좋습니다.

 int result= 0 ;
//---
switch (period)
  {
   case PERIOD_M1 : result= OBJ_PERIOD_M1 ; break ;
   case PERIOD_M2 : result= OBJ_PERIOD_M2 ; break ;
   case PERIOD_M3 : result= OBJ_PERIOD_M3 ; break ;
   case PERIOD_M4 : result= OBJ_PERIOD_M4 ; break ;
   case PERIOD_M5 : result= OBJ_PERIOD_M5 ; break ;

//--- и так далее

   default : print( "Что-то новенькое" );
  }

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Видимость объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Видимость объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Видимость объектов - Документация по MQL5
 
x100intraday :

가시성 공식에 감사드립니다. 아마도 어딘가에 적용할 것입니다. 기간의 값을 보면 이것이 무언가의 정도라는 것이 분명했지만, 스스로 수식을 복원하려고 하지는 않았습니다.

-1이 필요합니까? 일반적으로 Visibility[]는 내 생각에 잘못된 값으로 채워져 있지만 실제로는 -1이 없는 모든 곳에 있어야 합니다. 즉, 1, 2, 4, 8, 16 ...

1,2,4 등 - 하나의 TF에서 개체의 가시성. = MathPow(2,i);

현재 및 더 작은 1, 1+2, 1+2+4, 1+2+4+8 등에서 =MathPow(2,i+1)-1;

바이너리로 더 나은..

삼촌 빅 :

두려움은 아주 잘 근거가 있습니다. 위의 코드는 가시성 플래그 세트가 실제로 매크로임을 정당화합니다.

다음을 통해 작업하는 것이 좋습니다.

원칙적으로는 동일합니다. TF 목록에서 변경할 때 코드를 편집해야 합니다.

나는 보편적인 해결책을 상상할 수 없으며 여전히 가능한 변화를 예측하는 것이 이론적으로 불가능하다고 생각합니다.


x100일중 :

그러나 다시 말하지만 그렇지 않습니다. 이제 설명하겠습니다. 이 예에서 정적 ENUM_TIMEFRAMES _p_int[]는 21개 요소로 설정되지만! 나는 이것을 원한다: 나는 이미 유사한 배열을 가지고 있지만 임의의 길이일 수 있다. 이것은 무언가가 구축될 시간 프레임을 포함하는 배열이지만 모든 하위 시간 프레임에 대한 가시성을 가져야 하며 단일 배열이 별도로 또는 기존 배열과 함께 채워지지 않아야 합니다. 즉, 여기에서 회귀 사이클에서 현재 및 모든 하위 기간의 플래그를 계산하고 합산하기 위해 현재 TF에서 즉석에서 춤을 추는 필요성을 언급합니다. 트릭은 무언가의 사전 정의된 값(적어도 시간 프레임, 최소한 가시성 플래그)의 완전한 배열을 생성하고 이를 양모하는 것이 아니라, 일하다.

아니오, 작동하지 않습니다. 대응 tf 및 가시성이 설정되어야 합니다. 또는 두 개의 해당 어레이 또는 스위치가 있는 변형.

+ 필요한 TF가 있는 배열, + 초기화에서 이 모든 데이터를 사용하여 사용된 각 TF에 대한 개체의 가시성을 계산합니다. 이 같은..)

 

머리를 통째로 부숴버렸어, 무슨 일인지 모르겠어?

 double VirtualSL;
MqlTick tick;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   VirtualSL= 0.0 ;
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   trail();
  }
//+------------------------------------------------------------------+
void trail()
  {
   double stopcal;

   SymbolInfoTick ( _Symbol ,tick);
   stopcal=tick.bid;

//   if((VirtualSL!=0.0 && stopcal>VirtualSL) || VirtualSL==0.0) // так все работает

   if (VirtualSL== 0.0 || (VirtualSL!= 0.0 && stopcal>VirtualSL)) // так не хочет работать
     {
      VirtualSL=stopcal;
       Print ( "use Ok!" );
     }
   if (VirtualSL<stopcal) Print ( "o_O ((((( stopcal = " ,stopcal, "   VirtualSL = " ,VirtualSL);
  }
//+------------------------------------------------------------------+

2011.12.29 01:16:07 코어 1 2011.09.26 02:54:13 o_O ((((( stopcal = 1.54508 VirtualSL = 1.53378

2011.12.29 01:16:07 코어 1 2011.09.26 02:54:12 o_O ((((( stopcal = 1.54507 VirtualSL = 1.53378)

2011.12.29 01:16:07 코어 1 2011.09.26 02:54:12 o_O ((((( stopcal = 1.54508 VirtualSL = 1.53378


 
her.human :

머리를 통째로 부숴버렸어, 무슨 일인지 모르겠어?

컴파일러 최적화 프로그램에 오류가 있습니다. 게시해 주셔서 감사합니다. 수정하겠습니다.

이 디자인에 오류가 발생했습니다.

 if (VirtualSL== 0.0 || (VirtualSL!= 0.0 && stopcal>VirtualSL))
if (VirtualSL<stopcal)
첫 번째 if의 조건에서 VirtualSL!= 0.0 은 두 번째 부분에서 제거될 수 있습니다. 조건의 첫 번째 부분을 확인한 후 이 표현식은 항상 참입니다. 이 경우 옵티마이저 오류가 사라집니다.


수정되었습니다. 수정 사항은 다음 빌드에 포함됩니다.
사유: