iBarShift와 유사함 - 페이지 14

 
fxsaber :

그렇다면 왜 Bars가 18:00:01이 18:00이 아니라 M1-bar 18:01에 속한다고 생각하는지 이해가 되지 않습니다.

그리고 여기에 내 딸이 이제 겨우 1주일이 되었지만 이제 2학년이라는 사실과 같은 논리입니다. 또는 오늘은 2018년 4월 9일이지만, 00년 1월 1일은 2017년 3개월 8일 전입니다.

그건 그렇고, TimeCurrent는 SYMBOL_TIME으로 대체되어야 합니다.

고맙습니다! 나는 그런 식별자에 대해 정말로 몰랐다.

 

그건 그렇고, iBars 알고리즘의 정확성을 테스트하고 MQL4의 Bars 표준과 비교하고 다양한 옵션을 무작위로 정렬했을 때 Bars에서 버그를 발견했습니다.

 Print ( Bars ( _Symbol , PERIOD_MN1 , D'2005.08.31 00:00:00' , D'2005.08.31 23:00:00' )); // 1  должен быть 0, т.к. временной диапазон находиться внутри одного бара.
Print ( Bars ( _Symbol , PERIOD_MN1 , D'2006.08.31 00:00:00' , D'2006.08.31 23:00:00' )); // 0

또한 이 버그는 MQL5에 존재하지 않습니다.

물론 미미하기 때문에. TF = MN1, 날짜 30 및 31, 시간 stop_time = 23, 2005년까지만 나타납니다 :)))

다음은 이를 포착하는 MQL4용 스크립트입니다. 반면 iBars는 기본 Bars보다 더 표준적인 것으로 판명되었습니다.

파일:
TestiBars.mq4  10 kb
 
fxsaber :


그건 그렇고, TimeCurrent는 SYMBOL_TIME으로 대체되어야 합니다.

아니요, 필요하지 않습니다.
정확성을 추가하지 않습니다. TimeCurrent()는 모든 문자에 대해 보편적입니다. 현재 기호가 아닌 모든 기호에 대한 견적의 최신 도착 시간을 반환합니다.

동시에 SymbolInfoInteger(symbol_name,SYMBOL_TIME)는 TimeCurrent()에 비해 매우 느리며, 이 시간은 iBars를 호출할 때마다 필요합니다.

 

관심 있는 분들을 위해.

iBars의 편집된 버전(내장 막대와 유사하지만 결함 없이 더 빠름).

일부 버그를 수정했습니다.

MQL5 코드가 이유 없이 10-20초 동안 정지되고 0을 반환할 수 있는 Bars 기능 이 있는 것을 발견했다면 이 옵션으로 교체하는 것이 좋습니다.
이 끊김 없이 더 빠르게 작동합니다.

 int iBars ( string symbol_name, ENUM_TIMEFRAMES   timeframe, datetime start_time, datetime stop_time)
  {
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;
   static datetime LastTime0= 0 ;
   static int PerSec= 0 ;
   static int PreBars= 0 ;
   static datetime LastBAR= 0 ;
   static datetime LastTimeCur= 0 ;
   datetime TimeCur;
   if (stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur= TimeCurrent ();
   if (LastTimeFrame!=timeframe) if (timeframe== PERIOD_MN1 ) PerSec= 2419200 ; else PerSec=:: PeriodSeconds (timeframe);
   if (timeframe< PERIOD_W1 ) TimeCur-=TimeCur%PerSec;
   if (start_time>TimeCur) {LastSymb= NULL ; return ( 0 );}
   if (LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)> 0 && TimeCur!=LastTimeCur))
      LastBAR=( datetime ) SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE );

   LastTimeCur=TimeCur;
   if (PerSec== 0 ) return ( 0 );
   if (start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return ( 0 );}

   datetime tS,tF= 0 ;
   bool check= true ;
   if (timeframe< PERIOD_W1 ) tS=start_time-(start_time- 1 )%PerSec- 1 ;
   else if (timeframe== PERIOD_W1 ) tS=start_time-(start_time- 259201 )%PerSec- 1 ;
   else
     {
      PerSec= 2678400 ;
       MqlDateTime dt;
       TimeToStruct (start_time- 1 ,dt);
      tS=dt.year* 12 +dt.mon;
     }
   if (stop_time<=LastBAR)
     {
       if (timeframe< PERIOD_W1 ) tF=stop_time-(stop_time)%PerSec;
       else if (timeframe== PERIOD_W1 ) tF=stop_time-(stop_time- 259200 )%PerSec;
       else
        {
         MqlDateTime dt0;
         TimeToStruct (stop_time,dt0);
         tF=dt0.year* 12 +dt0.mon;
        }
       if (tS==tF) {PreBars= 0 ; check= false ;}
     }
   if ((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars= Bars (symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=( datetime )tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return (PreBars);
  }
 
Nikolai Semko :

iBars의 편집된 버전( 내장 Bars와 유사하며 결함 없이 더 빠름).

일부 버그를 수정했습니다.

내장 Bars()가 오버로드되었습니다.

 1. int Bars ( const string symbol_name, ENUM_TIMEFRAMES timeframe)
 2. int Bars ( const string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, datetime stop_time)

당신은 한 가지 형태의 전화만 가지고 있습니다.

 
Artyom Trishkin :

내장 Bars()가 오버로드되었습니다.

당신은 한 가지 형태의 전화만 가지고 있습니다.

짧은 형식을 원하면 내장 형식을 사용하는 것이 좋습니다. 결함이 있을 가능성은 거의 없습니다.

 
Nikolai Semko :

아니요, 필요하지 않습니다.
정확성을 추가하지 않습니다. TimeCurrent()는 모든 문자에 대해 보편적입니다. 현재 기호가 아닌 모든 기호에 대한 견적의 최신 도착 시간을 반환합니다.

동시에 SymbolInfoInteger(symbol_name,SYMBOL_TIME)는 TimeCurrent()에 비해 매우 느리며, 이 시간은 iBars를 호출할 때마다 필요합니다.

따옴표는 관심 있는 기호를 제외한 모든 기호 뒤에 올 수 있습니다.

좋아, 나는 새로운 소스를 보았다. 논의된 내용이 수정되지 않았음을 확인했습니다. 내가 간다

 
그래서 개발자가 직접하지 않습니까?
 
사용자가 하나의 함수를 호출하고 여러 기기에 대해 시간 동기화된(정렬된) 시리즈 배열을 얻는 것이 훨씬 더 편리할 것입니다.
 
그건 그렇고, Bars() 함수에 대해. 아마도 이것이 클린치의 이유일 것입니다.