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

 

ArrayInitialize 코드가 작동하지 않으며 주기의 주석을 제거하면 모든 것이 정상입니다.

그리고 클래스의 변수와 글로벌 수준의 인디케이터를 같은 이름으로 선언하면 경고창이 뜹니다.

 #property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1   "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- plot Line2
#property indicator_label2   "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2   1
//--- indicator buffers
double          Line1Buffer[];
double          Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit ()
  {
   SetIndexBuffer ( 0 ,Line1Buffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,Line2Buffer, INDICATOR_DATA );
   ArraySetAsSeries (Line1Buffer, true ) ;
   ArraySetAsSeries (Line2Buffer, true ) ;
   ArrayInitialize (Line1Buffer, EMPTY_VALUE ) ;
   ArrayInitialize (Line2Buffer, EMPTY_VALUE );
   return ( 0 );
  }
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
       ArraySetAsSeries (price, true ) ;
       int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
       for (i= 0 ;i< 100 ;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

주말에 틱이 없는 동안 데모 계정의 표시기를 디버깅하여 마지막 빌드에서 MT5 터미널의 두 인스턴스를 실행했지만 MetaQuotes와 EGlobal은 서로 다른 회사에서 실행했습니다. 설정은 어딜가나 똑같습니다. 확실히 오프라인에서 체크해서 틱팩터는 제외했습니다.

문제는 다른 회사의 다른 터미널에서 가장 단순한 "under-indicator" 코드(완전하고 복잡한 지표는 말할 것도 없고)는 결과의 다른 양의 출력을 표시한다는 것입니다.

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit ()
  {
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );

   handle= iFractals ( _Symbol , PERIOD_CURRENT );
   if (handle== INVALID_HANDLE ) return (- 1 );

   return ( 0 );
  }

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   Print ( 1 );

   return (rates_total);
  }

1. 이글로벌 . 2. 메타 따옴표 . 이글로벌메타 인용문

나는 두 터미널을 완전히 언로드하고(작업 관리자를 통해 메모리의 프로세스를 확인) 다시 로드했으며 두 코드를 다시 컴파일하는 경우를 대비하여 두 터미널을 모두 로드했습니다. 결국 - 변화가 없습니다.

 
여기에는 놀라운 것이 없습니다.
 

MathRound() 는 4와 5에서 다르게 작동하지만 동일해야 합니다.

네 번째 코드:

 int start()
{
   double minlot= 0.01 ;
   double step  = 0.01 ;
   Print (minlot+step* MathRound (( 0.005 - minlot)/step));
   return ( 0 );
}

다섯 번째 코드:

 void OnStart ()
{
   double minlot= 0.01 ;
   double step  = 0.01 ;
   Print (minlot+step* MathRound (( 0.005 - minlot)/step));
}
 
joo :

MathRound()는 4와 5에서 다르게 작동하지만 동일해야 합니다.

네 번째 코드:

다섯 번째 코드:

문제는 다음과 같습니다.

   double y= MathRound (- 0.5 );
   Print ( "Округление -0.5 до " ,y);

이 값은 4-ke와 5-ke에서 다르게 반올림됩니다.

 
Loky :
여기에는 놀라운 것이 없습니다.
그리고 더 구체적으로?
 

테스트가 중단된 경우 MT5 가 주문 내역 등을 저장하지 않는 이유는 무엇입니까? MT4에 저장되었습니다.

또한 테스트 차트의 주문 내역에는 포지셔닝이 없습니다. 차트를 클릭하여 큰 하락 영역의 주문을 확인하는 것이 편리했습니다.

 

좋은 저녁이에요.

SLeep() 메서드가 어떻게 작동하는지 설명해 주시겠습니까?

아이디어에 따르면 Expert Advisor를 일정 시간 동안 중단해야합니까, 아니면 제가 잘못 알고 있습니까?


{for (int sleep=0;sleep<10000;sleep++)

if ( BarsCalculated (Handle)>=o_bars_reoptimizate)

{ 인쇄(BarsCalculated(핸들)); 부서지다; } 그렇지 않으면 절전(100);}

이 코드에 따르면 다음 결과를 기다리고 있습니다. - 특정 지표의 계산된 막대 수가 특정 값 이상이 되면 사이클이 중단됩니다. 그렇지 않으면 100ms의 추가 코드 실행 지연이 있습니다. 총 가능한 총 지연은 100*10000ms입니다.... 표시기 계산에 충분한 시간입니다. 그러면 코드가 계속 실행되는 이유는 무엇입니까?(이 루프를 뒤따름) 또는 테스터에서 이 기능이 내가 가정한 대로 작동하지 않습니다. 설명에 미리 감사드립니다.

 
mi__x__an :

좋은 저녁이에요.

SLeep() 메서드가 어떻게 작동하는지 설명해 주시겠습니까?

아이디어에 따르면 Expert Advisor를 일정 시간 동안 중단해야합니까, 아니면 제가 잘못 알고 있습니까?


{for (int sleep=0;sleep<10000;sleep++)

if (BarsCalculated(Handle)>=o_bars_reoptimizate)

{ 인쇄(BarsCalculated(핸들)); 부서지다; } 그렇지 않으면 절전(100);}

이 코드에 따르면 다음 결과를 기다리고 있습니다. - 특정 지표의 계산된 막대 수가 특정 값 이상이 되면 사이클이 중단됩니다. 그렇지 않으면 100ms의 추가 코드 실행 지연이 있습니다. 총 가능한 총 지연은 100*10000ms입니다....표시기를 계산하기에 충분한 시간입니다. 그러면 코드가 계속 실행되는 이유는 무엇입니까?(이 루프 다음에 있음) 또는 테스터에서 이 기능이 내가 가정한 대로 작동하지 않습니다. 설명에 미리 감사드립니다.

수면 표시기에서 작동하지 않습니다
 

뇌의 덜걱거림은 CopyBuffer 와 같은 문서로 인해 발생합니다. " 표시기 값을 다른 배열( 표시기 버퍼 가 아님)에 부분적으로 복사해야 하는 경우 이러한 목적을 위해 중간 배열을 사용해야 합니다. 필요한 양이 복사됩니다. 그리고 이미이 중간 배열에서 원하는 수의 값을 수신 배열의 원하는 위치에 요소별로 복사합니다. "

 int    CopyBuffer (
   int        indicator_handle,     // handle индикатора
   int        buffer_num,           // номер буфера индикатора
   [...]
   );

buffer_num 이 명시적으로 참조되는 경우 SetIndexBuffer 를 통해 하나 또는 다른 서수 아래에 있는 표시기 버퍼와 수신 배열을 먼저 연결할 필요가 있음을 분명히 의미합니다. 아마도 INDICATOR_CALCULATIONS 로 가장할 것입니다. 그러나 " 지시자 값을 다른 배열(지시자 버퍼가 아님)에 부분적으로 복사해야 하는 경우 " buffer_num 은 지시자가 아니며 정의에 따라 그렇게 하지 않았기 때문에 어떠한 버퍼_num에도 의문의 여지 가 없습니다. 무엇이든 연결하십시오.

모순?

모호?

아니면 완전히 프로그래밍되어 있습니까?

인디케이터 버퍼에 대한 명확한 정의를 스스로 찾으려고 노력했지만 찾을 수 없었습니다. SetIndexBuffer 를 통해 연결된 모든 것입니까, 아니면 충분하지 않고 ID가 INDICATOR_DATA 인 배열이어야 합니까?

사유: