포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 600

 

인사말! :)

대략 다음과 같은 표시기 코드가 있습니다.

 bool busy=false;

int start()
{
   int counted_bars= IndicatorCounted ();
   if (counted_bars< 0 ) return (- 1 );
   limit= Bars -counted_bars+ 1 ;
   limit= MathMin (bBars- 1 , limit);
   if ( IndicatorCounted ()> 0 ) limit= 1 ;
   
   FileWrite(han, TimeToStr ( TimeCurrent (), TIME_MINUTES | TIME_SECONDS ), Bars , IndicatorCounted ());
   FileFlush (han);
   //if(busy=false) return(0);
   for (i= 0 ; i<limit; i++)
   { 
      busy= true ;
       FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
       FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

M1 차트에 던집니다. 표시기는 터미널과 함께 매달려 계산을 수행한다고 가정합니다.
15분 후에 강제로 닫고 로그를 열고 다음을 확인합니다.

Pic1

표시기는 처음으로 계산할 때까지 새로 오는 틱에 (논리적으로) 반응하지 않는 것으로 나타났습니다. 하지만! 렌더링할 때 IndicatorConted()에 이미 0이 아닌 값이 할당 되어야 한다는 것을 터미널에 알리는 것을 잊습니다.
즉, 잘못된 계산을 위해 대기열에 있는 새로 오는 틱이 IndicatorCounted()의 현재 값을 기억한다는 사실이 밝혀졌습니다.

사용 중인 변수를 통해 제어를 시도했습니다(줄 주석 처리 - 동일한 결과).

다음과 같이 시도했습니다.

 int start()
{
   FileWrite(han, TimeToStr ( TimeCurrent (), TIME_MINUTES | TIME_SECONDS ), Bars , IndicatorCounted ());
   FileFlush (han);
   return ( 0 );
   .
   .
   .
}

당연히 이번에는 모든 것이 올바르게 작동했습니다.

Pic2

무슨 일이야? 시스템이 IndicatorCounted()에 새 값을 쓸 시간이 없습니까? 즉, sleep()과 같은 작업을 수행해야 합니까? 지표에서는 불가능한 것으로 알고 있습니다)
또는 새 틱이 도착하면 이전 틱이 아직 계산을 완료하지 않았기 때문에 IndicatorCounte()가 여전히 0임을 기억하고 시간이 되면 IndicatourCounted()=0의 이전 값을 기반으로 계산을 시작합니다. ?

일반적으로 어떻게 될까요? )

 
Expert :

인사말! :)

대략 다음과 같은 표시기 코드 가 있습니다.


그것이 모든 것을 말해줍니다. 이 코드와 같은 것, 이 답변과 같은 것 ... eh ?
 
peace1984 :
이것은 나의 첫 경험이므로 엄격하게 판단하지 마십시오 :)
솔직히 테스터는 마지막 테스트에서 변수의 과거 값을 기억하는 것 같습니다. 어떻게 - HZ, 보고할 시간이 거의 없습니다. 아마도 터미널 버그 일 것입니다. 방금 코드에 주석을 삽입 하고 값을 로그에 출력했습니다. 새로운 테스트를 실행할 때마다 이전 테스트의 값이 sys 변수에 저장됩니다. 일종의 무화과. 다른 사람이 볼 수도 있고 내 눈이 흐릿할 수도 있습니다 ...
파일:
11_1.mq4  8 kb
 
AlexeyVik :
그것이 모든 것을 말해줍니다. 이 코드와 같은 것, 이 답변과 같은 것 ... eh ?


요점은 나머지 코드는 중요하지 않다는 것입니다. 오류의 본질은 이 부분에 설명되어 있습니다.
일반적으로 큰 게시물로 사람들을 놀라게하는 것이 두려웠습니다. 그리고 그것을 날려 버렸습니다.

간단히 말해서 다음과 같이 공식화할 수 있습니다 . 지표 계산이 오랜 시간(1분 이상) 동안 계산되면 IndicatorCounted()는 지속적으로 0을 반환합니다.

 
artmedia70 :
솔직히 테스터는 마지막 테스트에서 변수의 과거 값을 기억하는 것 같습니다. 어떻게 - HZ, 보고할 시간이 거의 없습니다. 아마도 터미널 버그 일 것입니다. 방금 코드에 주석을 삽입하고 값을 로그에 출력했습니다. 새로운 테스트를 실행할 때마다 이전 테스트의 값이 sys 변수에 저장됩니다. 일종의 무화과. 다른 사람이 볼 수도 있고 내 눈이 흐릿할 수도 있습니다 ...

당신은 그 라인을 잊었다

 int        sys=(Sys< 0 )? 0 :Sys;

표시기 속성이 다시 호출되면 실행되지 않습니다.

자세히 살펴보지는 않았지만 이렇게 하면 원하는 결과가 나올 수 있지 않을까요?

 extern int Sys= 0 ;
int        sys;    // изменено
double     opb;
double     ops;
double     cb;
double     cs;
double     lot;
double     next_order;
int        i= 0 ;
int        x;
double     max;
double     min;
int        ticket;
int        tip;
int        count;
bool       res;
double     bal;
double     sl;
datetime   d;
double     N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys< 0 )? 0 :Sys;  // добавлено
   bal= AccountBalance ();
   return ( 0 );
  }
 
AlexeyVik :

당신은 그 라인을 잊었습니다

표시기 속성이 다시 호출되면 실행되지 않습니다.

깊이 파고들지는 않았지만 이런 식으로 원하는 결과를 얻을 수 있지 않을까요?



기본적으로 고문. 하지만 HZ, 실험할 시간이 없습니다. 내가 쓴대로 모든 고문이 있습니다. 그들은 작동합니다. 테스터에서 이 쓰레기를 추적해야 합니다. 때가되면.
 
Expert :


요점은 나머지 코드는 중요하지 않다는 것입니다. 오류의 본질은 이 부분에 설명되어 있습니다.
일반적으로 나는 큰 게시물로 사람들을 놀라게하는 것이 두려웠습니다. 그리고 그것을 날려 버렸습니다.

간단히 말해서 다음과 같이 공식화할 수 있습니다. 지표 계산이 오랜 시간(1분 이상) 동안 계산되면 IndicatorCounted()는 지속적으로 0을 반환합니다.


네, 그게 핵심이 아닙니다. 아무도 당신의 완전한 비밀 코드를 필요로 하지 않습니다. 오해가 있을 수 있는 완전한 테스트 코드를 작성하십시오. 그리고 그래서

 bool busy=false;

int start()
{
   int counted_bars= IndicatorCounted ();
   if (counted_bars< 0 ) return (- 1 );
   limit= Bars -counted_bars+ 1 ;
   limit= MathMin (bBars- 1 , limit);
   if ( IndicatorCounted ()> 0 ) limit= 1 ;
   
   FileWrite(han, TimeToStr ( TimeCurrent (), TIME_MINUTES | TIME_SECONDS ), Bars , IndicatorCounted ());
   FileFlush (han);
   //if(busy=false) return(0);
   for (i= 0 ; i<limit; i++)
   { 
      busy= true ;
       FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
       FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

선택한 라인을 자레밀할 때??? 텔레파시는 도움이되지 않지만 단순한 필사자이며 훨씬 더 ...

그럼 이 부분을

   int counted_bars= IndicatorCounted ();
   if (counted_bars< 0 ) return (- 1 );
   limit= Bars -counted_bars+ 1 ;
   limit= MathMin (bBars- 1 , limit);
   if ( IndicatorCounted ()> 0 ) limit= 1 ;

어떤 프로그래머에게서 왔는지는 모르지만 여기에는 뭔가 부적절하게 쓰여져 있습니다... 돌은 당신에게 전달되지 않습니다. 다른 많은 사람들과 마찬가지로 당신은 방금 코드를 가져와서 편집하려고 했습니다...

counted_bars 변수가 마지막 표시기 호출 (첫 번째 줄) 이후 변경되지 않은 막대 수와 동일한 경우

if(counted_bars < 0)에 의해 확인되는 것이 어떻게 0보다 작아질 수 있는지 나는 결코 이해할 수 없을 것입니다...

더군다나 말도 안되는 소리지만 이미 정리하기 귀찮아서...

 
AlexeyVik :

당신은 그 라인을 잊었다

표시기 속성이 다시 호출되면 실행되지 않습니다.

자세히 살펴보지는 않았지만 이렇게 하면 원하는 결과가 나올 수 있지 않을까요?




해봤는데 안되네요..
 
artmedia70 :
기본적으로 고문. 하지만 HZ, 실험할 시간이 없습니다. 내가 쓴대로 모든 고문이 있습니다. 그들은 작동합니다. 테스터에서 이 쓰레기를 추적해야 합니다. 때가되면.

네, 물론 고문입니다. 그런 다음 또 다른 질문이 생깁니다. 고문이 차트에 지하 지표로 나타난 이유는 무엇입니까? 그러나 표시기와 어드바이저를 모두 다시 시작할 때 본질은 바뀌지 않습니다. 전역 수준 변수는 다시 초기화되지 않고 int sys=(Sys<0)?0:Sys; 수행되지 않습니다.
 
peace1984 :

해봤는데 안되네요..
아마 그렇게 시도하지 않았을 것입니다.
방금 EA에서 코드를 다시 컴파일하고 실행했습니다. 주석에서 Sys 매개변수를 변경하면 이 값이 변경됩니다.