iBarShift와 유사함 - 페이지 6

 
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가지 옵션이 있는 스크립트를 첨부합니다.

제시된 기능을 시도해 보았는데 차트에 없는 시간이 있는 막대를 요청하면 한 막대에 있는 것으로 나타났습니다. 저것들. 오늘의 첫 번째 막대를 알고 싶고 "03/28/2018 00:00" 시간을 요청했지만 그러한 시간의 막대가 없으면 이전 막대의 마지막 막대에 대한 인덱스를 얻습니다. 낮.

아니면 그렇게 의도한 것인가?

 
Aleksey Vyazmikin :

제시된 기능을 시도해 보았는데 차트에 없는 시간이 있는 막대를 요청하면 한 막대에 있는 것으로 나타났습니다. 저것들. 오늘의 첫 번째 막대를 알고 싶고 "03/28/2018 00:00" 시간을 요청했지만 그러한 시간의 막대가 없으면 이전 막대의 마지막 막대에 대한 인덱스를 얻습니다. 낮.

아니면 그렇게 의도한 것인가?

어떻게 시간을 문자열로 전달합니까?
 
Renat Akhtyamov :
어떻게 시간을 문자열로 전달합니까?

그리고 나는 그것을 한 줄로 시도했고 이전에 배치 된 코드에서부터 시도했습니다.

 int teset_01= iBarShift ( _Symbol , PERIOD_CURRENT , StringToTime ( "30.03.2018 00:00" ), false );
Print ( "teset_01=" ,teset_01);
 
Aleksey Vyazmikin :

그리고 나는 그것을 한 줄로 시도했고 이전에 배치 된 코드에서부터 시도했습니다.

그는 가지고있다

 int iBarShift2( string symbol, ENUM_TIMEFRAMES timeframe, datetime time)

따라서 false의 존재는 완전히 명확하지 않습니다.

그렇다면:

 int teset_01= iBarShift 2( _Symbol , PERIOD_CURRENT , StringToTime ( "30.03.2018 00:00" ));
Print ( "teset_01=" ,teset_01);
?
 

이 코드에 정착하는 동안 빠르게 해결되는 것 같습니다.

 //+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+    
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);
  }  

누구든지 이 코드의 단점을 식별했거나 더 빠른 옵션이 있습니까?

그리고 음, 유일한 부정적인 점은 아직 차트에 없는 막대를 요청하는 경우입니다. 예를 들어 오늘의 시간으로 ....이 문제를 어떻게든 해결할 수 있을까요? 마지막으로 알려진 막대를 반환하는 것이 좋습니다. 이것은 현재 시간 에 작동하는 알고리즘 작업과 관련이 있을 수 있습니다.

 
Renat Akhtyamov :

그는 가지고있다

따라서 false의 존재는 완전히 명확하지 않습니다.

false - 표준화를 위해 아무 영향도 미치지 않습니다. :) 솔직히 말해서, 이 false가 일부 기능에서 전혀 필요한 이유를 모르겠습니다.

 
Aleksey Vyazmikin :

이 코드에 정착하는 동안 빠르게 해결되는 것 같습니다.

누구든지 이 코드의 단점을 식별했거나 더 빠른 옵션이 있습니까?

그리고 음, 유일한 부정적인 점은 아직 차트에 없는 막대를 요청하는 경우입니다. 예를 들어 오늘의 시간으로 ....이 문제를 어떻게든 해결할 수 있을까요? 마지막으로 알려진 막대를 반환하는 것이 좋습니다. 이것은현재 시간 에 작동하는 알고리즘 작업과 관련이 있을 수 있습니다.

존재하지 않는 막대 번호를 반환하는 것은 좋지 않습니다.

더 쉽게 반환 -1

 
Aleksey Vyazmikin :

false - 표준화를 위해 아무 영향도 미치지 않습니다. :) 솔직히 말해서, 이 false가 일부 기능에서 전혀 필요한 이유를 모르겠습니다.

나는 거기에서 길을 잃었고 나는 콜론이없는 심플 코드의 지지자입니다.
 
Renat Akhtyamov :

존재하지 않는 막대 번호를 반환하는 것은 좋지 않습니다.

더 쉽게 반환 -1

아니요, 마지막으로 알려진 막대를 반환하기만 하면 됩니다. 인덱스가 0이고 이제 그는 오랫동안 거기에 무엇을 반환할지 생각합니다.

다음은 하나의 막대가 잘못된 코드이며 올바른 막대(0)를 반환합니다.

아니면 시간이 없는 히스토리에서 바를 요청했을 때라는 사실을 말씀하시는 건가요? 그런 다음 가장 자주 존재하는 것에서 우리 시간에 가장 가까운 막대를 가져와야 한다고 생각합니다. 이 경우 코드는 기록에서 오프셋이 -1인 막대를 반환하지만 없는 경우에는 올바르게 작동합니다. 추가 기록 - 신속하게 0 막대를 반환합니다.

 
Aleksey Vyazmikin :

아니요, 마지막으로 알려진 막대를 반환하기만 하면 됩니다. 인덱스가 0이고 이제 그는 오랫동안 그곳에서 그에게 무엇을 돌려야할지 생각합니다.

다음은 하나의 막대가 잘못된 코드이며 올바른 막대(0)를 반환합니다.

아니면 존재하지 않는 히스토리에 바를 요청했을 때라는 사실을 말씀하시는 건가요? 그런 다음 가장 자주 존재하는 것에서 우리 시간에 가장 가까운 막대를 가져와야 한다고 생각합니다. 이 경우 코드는 기록에서 오프셋이 -1인 막대를 반환하지만 없는 경우에는 올바르게 작동합니다. 추가 기록 - 신속하게 0 막대를 반환합니다.

예(강조 표시)

-1은 빼기(지정해야 함)가 있는 단위이며 함수에서 반환된 오류로 이러한 막대가 없음을 나타냅니다.

그게 내 기능이야

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

iBarShift와 유사함

레나트 아크티아모프 , 2017.06.08 01:19

글쎄, 그것도 가능하다

 int iBarShift ( string symbol, ENUM_TIMEFRAMES timeframe, datetime tm)
   {
        datetime tm0[ 1 ];      
         CopyTime (symbol,timeframe, 0 , 1 ,tm0);
        int res= Bars (symbol,timeframe,tm0[ 0 ],tm)- 1 ;
         return (res);
   }

또한 개선이 필요합니다

그렇지만...

선적 서류 비치:

" 참고

Bars() 함수를 호출할 때 지정된 매개변수를 가진 시계열에 대한 데이터가 아직 터미널에서 생성되지 않았거나 함수 호출 시 시계열 데이터가 거래 서버와 동기화 되지 않은 경우 함수 는 null을 반환합니다. "

====

res==0이면 함수에서 -1을 catch합니다.

===

모든 것이 효과가 있으므로 건강에 사용하십시오!

사유: