iBarShift와 유사함 - 페이지 4

 
Nikolai Semko :

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

그것은:

그것은되었다:

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

2% 승. 논평.

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

이는 PeriodSeconds 문서 에 추가해야 합니다.

 
Aleksey Vyazmikin :

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

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

개인적으로 다음과 같은 기능을 사용하는 것이 적절하다고 생각합니다.

 int iBarShift ( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time)
  {
   static int Res=- 1 ;
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return (Res);
  }

그러나 이것은 적어도 Exact 매개변수가 없기 때문에 일반 MQL4 iBarShift 기능과 완전히 유사하지는 않습니다.

그렇지 않으면 동일합니다.

표준 및 이 기능의 완전한 ID를 보여주는 MQL4의 간단한 스크립트를 첨부합니다.

일반 함수 iBarShift 와 내 함수의 값이 같지 않으면 인쇄합니다. 나는 아무것도 인쇄하지 않았습니다.

 //+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   datetime t= TimeCurrent ()+ 1000 ;
   const ENUM_TIMEFRAMES tf[ 9 ]={ PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };
   while (! IsStopped ())
     {
       for ( int i= 0 ; i< 9 ;i++)
        {
         int i1= iBarShift ( NULL ,tf[i],t);
         int i2=iBarShift2( NULL ,tf[i],t);
         if (i1!=i2) Print ( EnumToString (tf[i]), "   " , TimeToString (t), "   " ,i1, "   " ,i2);
        }
      t-= 10 ;
       Comment ( TimeToString (t));
     }

  }
//+------------------------------------------------------------------+
int iBarShift2( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time)
  {
   static int Res=- 1 ;
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return (Res);
  }
//+------------------------------------------------------------------+
 
fxsaber :

2% 승. 논평.

뭐야, 사실이야?

GetMicrosecondCount()를 넣는 것이 게으르고 프로파일링을 신뢰했습니다.

 
Nikolai Semko :

뭐야, 사실이야?

GetMicrosecondCount()를 넣는 것이 게으르고 프로파일링을 신뢰했습니다.

프로파일링은 다른 것에 관한 것입니다. 2%는 얻을 수 있는 최대 승리입니다.

내 컴퓨터의 Tester에서 2억 5000만 호출은 1초를 절약합니다.

확실히 당신이 최고입니다! 그러나 MT5가 바와 함께 작동하는 이유를 상상조차 할 수 없습니다.

 
fxsaber :

하지만 왜 MT5에서 막대로 작업해야 하는지 상상조차 할 수 없습니다.

저는 마우스를 사용할 때 이것을 사용합니다. 예를 들어 여기 .

 
Nikolai Semko :

저는 마우스를 사용할 때 이것을 사용합니다. 예를 들어 여기 .

예, 이것은 내가 이해하지 못하는 것입니다.

 
fxsaber :

예, 이것은 내가 이해하지 못하는 것입니다.

오해가 이해가 안됨

예를 들어 채널이 있는데 그 특성 중 하나가 시작 시간(왼쪽 테두리)입니다. 그리고 다른 TF에 이 채널을 구축해야 합니다. 글쎄요, 잠시 후 새 TF에서 막대 번호를 찾는 것 외에 다른 대안이 있습니까?

예, 훨씬 더 많습니다.

예를 들어, 모든 TF를 로그 스케일로 하나로 결합할 때. 이것은 매우 멋진 주제입니다. 여기에서도 iBarShift 의 아날로그 없이는 할 수 없습니다.

 
Nikolai Semko :

개인적으로 다음과 같은 기능을 사용하는 것이 적절하다고 생각합니다.

그러나 이것은 적어도 Exact 매개변수가 없기 때문에 일반 MQL4 iBarShift 기능과 완전히 유사하지는 않습니다.

그렇지 않으면 동일합니다.

표준 및 이 기능의 완전한 ID를 보여주는 MQL4의 간단한 스크립트를 첨부합니다.

일반 함수 iBarShift 와 내 함수의 값이 같지 않으면 인쇄합니다. 나는 아무것도 인쇄하지 않았습니다.

아니요, Comment() 때문에 인쇄되지 않았습니다.

그것을 제거하면 1만큼 불일치가 있지만 나는 이것을 실수로 간주하지 않습니다. 왜냐하면. 사실, 새로운 막대 의 정의는 막대의 절반이 이동하는 두 가지 알고리즘에서 발생합니다. 새 막대를 정의하는 제 버전은 일반 막대보다 더 논리적으로 보입니다.

 
Nikolai Semko :

오해가 이해가 안됨

막대를 사용하는 요점을 이해하지 못합니다. CopyRates

 

스크립트가 왜 이렇게 느린가요?

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:20:49.300 Scripts script BS (Si Splice,H4) loaded successfully

2018.03.30 09:21:20.209 Scripts script BS (Si Splice,H4) removed

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property script_show_inputs

input ENUM_TIMEFRAMES TF= PERIOD_D1 ;
input int Bar= 3 ;
input int calcN= 1 ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   for ( int index= 0 ;index<calcN;index++)
     {
       int Day_Shift= iBarShift ( _Symbol ,TF, iTime ( _Symbol , PERIOD_CURRENT ,index), false );
       int Start= iBarShift ( _Symbol , PERIOD_CURRENT , iTime ( _Symbol ,TF,Bar+Day_Shift), false );
       int Stop= iBarShift ( _Symbol , PERIOD_CURRENT , iTime ( _Symbol ,TF,Day_Shift), false );

       if (index< 3 ) Print ( "1 Start=" ,Start, " Stop=" ,Stop, " Day_Shift=" ,Day_Shift, " index=" ,index);

       if (index< 3 ) Print ( "1 Start=" , TimeToString ( iTime ( _Symbol ,TF,Bar+Day_Shift), TIME_DATE | TIME_MINUTES ),
         " Stop=" , TimeToString ( iTime ( _Symbol ,TF,Day_Shift), TIME_DATE | TIME_MINUTES ),
         " Day_Shift=" , TimeToString ( iTime ( _Symbol , PERIOD_CURRENT ,index), TIME_DATE | TIME_MINUTES ), " index=" ,index);
     }



   for ( int index= 0 ;index<calcN;index++)
     {
       int Day_Shift=iBarShift2( _Symbol ,TF, iTime ( _Symbol , PERIOD_CURRENT ,index), false );
       int Start=iBarShift2( _Symbol , PERIOD_CURRENT , iTime ( _Symbol ,TF,Bar+Day_Shift), false );
       int Stop=iBarShift2( _Symbol , PERIOD_CURRENT , iTime ( _Symbol ,TF,Day_Shift), false );

       if (index< 3 ) Print ( "2 Start=" ,Start, " Stop=" ,Stop, " Day_Shift=" ,Day_Shift, " index=" ,index);

       if (index< 3 ) Print ( "2 Start=" , TimeToString ( iTime ( _Symbol ,TF,Bar+Day_Shift), TIME_DATE | TIME_MINUTES ),
         " Stop=" , TimeToString ( iTime ( _Symbol ,TF,Day_Shift), TIME_DATE | TIME_MINUTES ),
         " Day_Shift=" , TimeToString ( iTime ( _Symbol , PERIOD_CURRENT ,index), TIME_DATE | TIME_MINUTES ), " index=" ,index);
     }
   return ;

  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+  
int iBarShift2( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, bool exact= false )
  {
   static int Res=- 1 ;
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return (Res);
  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+   
int iBarShift ( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, bool exact= false )
  {
   static int Res=- 1 ;
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return (Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime ( string symbol, ENUM_TIMEFRAMES tf, int index)
  {
   if (index < 0 ) return (- 1 );
   datetime Arr[];
   if ( CopyTime (symbol,tf,index, 1 ,Arr)> 0 )
       return (Arr[ 0 ]);
   else return (- 1 );
  }
//+------------------------------------------------------------------+
사유: