iBarShift와 유사함 - 페이지 3

 
Vasiliy Pushkaryov :

스크립트는 다음과 같습니다.

그는 그냥 매달려. 차트에서 강제로 삭제하면 결과가 나옵니다.

그래서 노력해서 조언을 드렸습니다. 그러나 당신이 그것을 사용하고 당신에게 적합하기 때문에 나는 당신을 설득하지 않을 것입니다.

미안해, 바실리. 내가 당신을 오해했다. 나는 당신의 메시지를 빨리 읽었습니다, t. 운전했다. 나는 우리가 32000000000 이 있는 마지막 매개변수에 대해 이야기하고 있다고 생각했는데, t 매개변수를 의미하는 것으로 나타났습니다. 예, 실제로 이것은 결과가 원래 MQL4 iBarShift()와 다른 유일한 경우입니다. 그러나 이 함수를 사용하여 현재 순간, 즉 TimeCurrent() , 막대가 0인 것이 분명한 경우. 일반적으로 TimeCurrent()Bars () 함수가 1이 아닌 0을 출력하는 것이 이상합니다. 형식적으로 이것은 개발자들의 덩어리지만 어떻게 보면 됩니다. 그러나 표준 Bars() 함수의 사용으로 인해 무언가가 멈출 수 없습니다. 특히 스크립트가 Print() 가 작동했기 때문에 모든 것이 정상입니다.
Vasily, 나는 iBarShift 아날로그의 다른 구현을 과소평가하고 싶지 않습니다. 저는 개인적으로 그러한 구성을 사용합니다( Bars ( NULL , 0 , t , 32000000000 )- 1 ;), 가장 빠르기 때문입니다. 그리고 이 구성은 iBarShift를 대체하는 것으로 사용되는 것이 아니라 단순히 지정된 시간에 막대 인덱스를 찾는 기능으로 사용되며 보편성이 무엇을 의미하는지 이해하지 못합니다. 그리고 위의 모든 기능을 사용하는 것은 더 많은 시간 비용 때문에 합리적이지 않다고 생각합니다. (Dosya 분말에 대한 광고를 기억하십시오). 사실 이 함수의 사용은 큰 주기에서 매우 자주 발생하여 프로그램의 실행 시간을 크게 늘리고 실행 시간에 대한 욕심이 매우 큽니다. 나는 다양한 기능의 실행 시간을 계산하는 실험을 했고(나뿐만 아니라 이전 메시지 참조 ) 이 옵션이 확실히 가장 빠릅니다. 가장 빠른 위치에 있는 이 옵션 도 구성( Bars ( NULL , 0 , t , 32000000000 )- 1 ;) 만 동일 하며 훨씬 더 단순화되었습니다. 물론, 무엇을 사용할지는 모두에게 달려 있습니다.

어쨌든 장점에 대한 귀하의 의견에 감사드립니다.

 
Nikolai Semko :

그러나 이 함수를 사용하여 현재 순간, 즉 TimeCurrent() , 막대가 0인 것이 분명한 경우. 일반적으로 TimeCurrent()Bars () 함수가 1이 아닌 0을 출력하는 것이 이상합니다. 형식적으로 이것은 개발자들의 덩어리지만 어떻게 보면 됩니다.

TimeCurrent() 와 마찬가지로 특별한 경우가 손에 들어왔다.

이제 Bar () 함수에 대한 이 메모를 더 자세히 읽었습니다.

"주어진 날짜 범위에 있는 막대의 수를 요청할 때 이 범위에 속하는 시간을 가진 막대만 고려됩니다 . 예를 들어, 현재 요일이 토요일인 경우 다음으로 주간 막대의 수를 요청할 때 start_time=last_Tuesday 및 stop_time=last_Friday에서는 주간 시간대의 개장 시간이 항상 일요일이고 단일 주간 막대가 지정된 범위에 속하지 않기 때문에 함수는 0을 반환합니다."

TimeCurrent() 의 시간은 거의 항상 현재 막대의 여는 시간보다 늦기 때문에 Bars() 함수는 0을 반환합니다. 매시간 02:05에 해당하는 시간을 시간 단위로 전달하면 start_time 매개변수를 사용하고 2시에 시작하여 막대를 크레딧에 표시하려면 CopyTime() 을 통해 막대를 여는 시간(02:00:00)을 가져와야 합니다. 그렇지 않으면 Bars() 함수는 이 막대를 무시합니다.

저것들. 지금 시간이 3시 30분이면 매시간 2시 5분은 인덱스 1이 있는 막대를 참조한다는 것을 이해합니다. 두 번째 페이지의 어떤 기능도 이 인덱스를 반환하지 않습니다. 이 수정으로 Renat Akhtyamov 함수는 내가 기대했던 것을 반환했습니다.

 int iBarShift2( string symbol, ENUM_TIMEFRAMES timeframe, datetime time)
{
   datetime tm0[ 1 ], tm1[ 1 ];      
   CopyTime (symbol, timeframe, 0 , 1 , tm0);             // время открытия 0-го бара
   CopyTime (symbol, timeframe, time, 1 , tm1);           // время открытия бара, в который попадает указанный time

   return Bars (symbol, timeframe, tm0[ 0 ], tm1[ 0 ])- 1 ;
}

테스트로 사용한 인덱스 검색 기능 4가지 옵션이 있는 스크립트를 첨부합니다.

파일:
TestIBS.mq5  5 kb
 
Vasiliy Pushkaryov :

TimeCurrent() 와 마찬가지로 특별한 경우가 손에 들어왔다.

이제 Bar () 함수에 대한 이 메모를 더 자세히 읽었습니다.

"주어진 날짜 범위에 있는 막대의 수를 요청할 때 이 범위에 속하는 시간을 가진 막대만 고려됩니다 . 예를 들어, 현재 요일이 토요일인 경우 다음으로 주간 막대의 수를 요청할 때 start_time=last_Tuesday 및 stop_time=last_Friday에서는 주간 시간대의 개장 시간이 항상 일요일이고 단일 주간 막대가 지정된 범위에 속하지 않기 때문에 함수는 0을 반환합니다."

TimeCurrent() 시간은 현재 막대가 열리는 시간보다 거의 대부분 늦은 시간이므로 Bars() 함수는 0을 반환합니다. 매시간 02:05에 해당하는 시간을 시간 단위로 전달하면 start_time 매개변수를 사용하고 2시에 시작하여 막대를 크레딧에 표시하려면 CopyTime() 을 통해 막대를 여는 시간(02:00:00)을 가져와야 합니다. 그렇지 않으면 Bars() 함수는 이 막대를 무시합니다.

저것들. 지금 시간이 3시 30분이면 매시간 2시 5분은 인덱스 1이 있는 막대를 참조한다는 것을 이해합니다. 두 번째 페이지의 어떤 기능도 이 인덱스를 반환하지 않습니다. 이 수정으로 Renat Akhtyamov 함수는 내가 기대했던 것을 반환했습니다.

테스트로 사용한 인덱스 검색 기능 4가지 옵션이 있는 스크립트를 첨부합니다.

당연히 바의 시간을 옮겨야 합니다. 명확히 하는 것을 잊었다.
 
이 기능이 아직 SB에 없는 이유를 모르겠습니다.
 
transcendreamer :
이 기능이 아직 SB에 없는 이유를 모르겠습니다.

모든 옵션을 시도했지만 가장 정확한 옵션은 Alain Verleyen의 것입니다.
(많은 개체와 함께 복잡한 표시기에서 테스트됨)
 
Taras Slobodyanik :

모든 옵션을 시도했지만 가장 정확한 옵션은 Alain Verleyen의 것입니다.
(많은 개체와 함께 복잡한 표시기에서 테스트됨)
https://www.mql5.com/ru/code/18305
Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • 투표: 17
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

제 생각에는 SeriesInfoInteger 기능을 사용하는 것은 무료가 아니기 때문에 중복됩니다.

그것은 다음과 같았습니다.

 int iBarShift3( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, const bool Exact = false )
{
   static int Res = - 1 ;
   static string LastSymb = NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame = 0 ;
   static datetime LastTime = 0 ;
   static bool LastExact = false ;

  time -= time % :: PeriodSeconds (TimeFrame);

   if ((time != LastTime) || (Symb != LastSymb) || (TimeFrame != LastTimeFrame) || (Exact != LastExact))
  {
     datetime LastBar;

     if (:: SeriesInfoInteger (Symb, TimeFrame, :: SERIES_LASTBAR_DATE , LastBar))
     {
         if (time > LastBar)
          Res = 0 ;
         else
        {
           const int Shift = :: Bars (Symb, TimeFrame, time, LastBar);

           if (Shift > 0 )
            Res = Shift - 1 ;
        }
      }

    LastTime = time;
    LastSymb = Symb;
    LastTimeFrame = TimeFrame;
    LastExact = Exact;
  }

   return (Res);
}

그것은되었다:

 int iBarShift3( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, const bool Exact= false )
  {
   static int Res=- 1 ;
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;
   static bool LastExact= false ;
   static int PerSec=:: PeriodSeconds (LastTimeFrame);
   
   if (LastTimeFrame!=TimeFrame) PerSec=:: PeriodSeconds (TimeFrame);
   time-=time%PerSec;

   if ((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame) || (Exact!=LastExact))
     {
      Res=:: Bars (Symb,TimeFrame,time, UINT_MAX )- 1 ;
       if (Res< 0 ) Res= 0 ;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
      LastExact=Exact;
     }

   return (Res);
  }

속도 증가는 약 1.5배입니다.

그리고 가장 빠른 선택인 것 같습니다. 사실, 마지막 정확한 매개변수는 가짜이며 제거할 수 있습니다. 그러나 나에 관해서는 - 그래서 필요하지 않습니다. 개인적으로 Exact = true를 사용해야 하는 작업을 한 적이 없습니다.

그러나 누군가가 여전히 그것을 필요로한다면 CopyTime은 필수 불가결하며 @Alain Verleyen 의이 옵션 을 사용하는 것이 좋습니다.

추신: 마지막 호출 이후 TF가 변경되지 않은 경우 PeriodSeconds 함수에 대한 불필요한 호출도 우회했습니다. 당첨금은 정말 약합니다. 몇 퍼센트지만 여전히 그렇습니다.

그리고 한 가지 더 명확히 하자면: 디자인

time-=time%PerSec;
PERIOD_W1 및 PERIOD_MN1에 대해 잘못 처리됩니다. 카운트다운은 1970년 1월 1일부터이며 월요일이 아니라 목요일입니다. 그리고 매월 초가 다릅니다.
 
Nikolai Semko :

제 생각에는 SeriesInfoInteger 기능을 사용하는 것은 무료가 아니기 때문에 중복됩니다.

그것은:

그것은되었다:

속도 증가는 약 1.5배입니다.

그리고 가장 빠른 선택인 것 같습니다. 사실, 마지막 정확한 매개변수는 가짜입니다. 그러나 나에 관해서는 - 그래서 필요하지 않습니다.

아니면 내가 틀렸습니까?

추신: 마지막 호출 이후 TF가 변경되지 않은 경우 PeriodSeconds 함수에 대한 불필요한 호출도 우회했습니다. 당첨금은 정말 약합니다. 몇 퍼센트지만 여전히 그렇습니다.

코드가 얼마나 난해하게 작성되었는지 이해가 되지 않아 질문드립니다. 차트가 하루 종일이 아닌 경우 코드가 작동합니까?

 
Aleksey Vyazmikin :

코드가 얼마나 난해하게 작성되었는지 이해가 되지 않아 질문드립니다. 차트가 하루 종일이 아닌 경우 코드가 작동합니까?

질문의 요지를 이해하지 못했습니다. 다르게 공식화하십시오.

차트는 하루의 첫 번째 초를 제외하고 항상 하루 종일이 아닙니다.

무슨 TF 말씀하시는 건가요? 낮?

그리고 당신이 확인하는 것을 막는 것은 무엇입니까?

코드는 내 것이 아니라 단순화하고 더 빠르게 만들었습니다.

이전 메시지에서 PERIOD_W1 및 PERIOD_MN1 계정을 추가했습니다.

@Alain Verleyen 을 포함하여 이전의 모든 알고리즘에 비정상적인 상황이 있습니다.

iBarShift MQL4의 완전한 유사체를 생성할 수 있지만 코드가 매우 방대할 것이므로 이 부분에서 어떤 점도 볼 수 없습니다.

 
Nikolai Semko :

질문의 요지를 이해하지 못했습니다. 다르게 공식화하십시오.

차트는 하루의 첫 번째 초를 제외하고 항상 하루 종일이 아닙니다.

무슨 TF 말씀하시는 건가요? 낮?

그리고 당신이 확인하는 것을 막는 것은 무엇입니까?

코드는 내 것이 아니라 단순화하고 더 빠르게 만들었습니다.

이전 메시지에서 PERIOD_W1 및 PERIOD_MN1 계정을 추가했습니다.

@Alain Verleyen 을 포함하여 이전의 모든 알고리즘에 비정상적인 상황이 있습니다.

iBarShift MQL4의 완전한 유사체를 생성할 수 있지만 코드가 매우 방대할 것이므로 이 부분에서 어떤 점도 볼 수 없습니다.

나는 그것을 확인하지 않았습니다. 왜냐하면 코드가 특정 상황에서 작동하는지 여부를 확실히 알아야하기 때문입니다. 그렇지 않으면 실수를 한 경우 다른 사람을 비난하는 것은 옳지 않습니다.

저는 이와 같은 상황에 대해 이야기하고 있습니다. 하루에 14시간이 있다고 가정해 보겠습니다(매시간 따옴표가 없는 경우에는 그 미만). 저는 M1 차트가 있고 마지막 날 M15를 따라 막대의 이동을 찾아야 합니다. . 저것들. 한 시간에 45분이 있거나 하루에 14시간이 있거나 다른 시간/촛불 공격이 있는 경우 모든 것이 올바르게 작동합니까?