iBarShift'e benzer - sayfa 4

 
Nikolai Semko :

Bence SeriesInfoInteger işlevini kullanmak gereksiz çünkü çok özgür değil.

Öyleydi:

Dönüştü:

Hızdaki kazanç yaklaşık bir buçuk katıdır.

%2 kazanır. Yorum.

PERIOD_W1 ve PERIOD_MN1 için yanlış işlenecek çünkü geri sayım 1 Ocak 1970'den ve bu Pazartesi değil Perşembe. Ve her ayın farklı bir saniye sayısı vardır.

Bunun PeriodSeconds Documentation'a eklenmesi gerekir.

 
Aleksey Vyazmikin :

Kontrol etmedim - çünkü kodun belirli bir durum için çalışıp çalışmayacağını kesin olarak bilmeniz gerekiyor, aksi takdirde kendiniz bir hata yaptıysanız diğerini suçlamak doğru değil.

Bunun gibi durumlardan bahsediyorum, diyelim ki günde 14 saatimiz var (veya her saat başı alıntı olmasaydı daha az), bir M1 grafiğim var ve önceki gün M15 boyunca çubuk kaymasını bulmam gerekiyor . Onlar. Bir saatte 45 dakika veya günde 14 saat veya başka bir zaman/mum atakları varsa her şey düzgün çalışacak mı?

Şahsen böyle bir işlevi kullanmanın uygun olduğunu düşünüyorum:

 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);
  }

Ancak bunun, en azından Exact parametresine sahip olmadığı için normal MQL4 iBarShift işlevinin tam bir analogu olmadığına dikkat edilmelidir.

Aksi takdirde, aynıdır.

MQL4'te standardın ve bu işlevin tam kimliğini gösteren basit bir komut dosyası ekliyorum.

Normal iBarShift işlevinden ve işlevimden gelen değerler eşit değilse, Yazdır. Hiçbir şey yazdırmadım.

 //+------------------------------------------------------------------+
//|                                                    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 kazanır. Yorum.

Ne, bu doğru mu?

GetMicrosecondCount()'u koymak için tembeldim ve profil oluşturmaya güvendim.

 
Nikolai Semko :

Ne, bu doğru mu?

GetMicrosecondCount()'u koymakta tembeldim ve profil oluşturmaya güvendim.

Profil oluşturma başka bir şeyle ilgilidir. %2, alabileceğiniz maksimum kazançtır.

Makinemde Tester'da 250 milyon arama 1 saniye tasarruf sağlıyor.

Kesinlikle seninki en iyisi! Ama MT5'in neden çubuklarla çalıştığını hayal bile edemiyorum.

 
fxsaber :

Ama MT5'te neden barlarla çalışmanız gerektiğini hayal bile edemiyorum.

Faremi kullandığımda bunu kullanıyorum. Örneğin burada .

 
Nikolai Semko :

Faremi kullandığımda bunu kullanıyorum. Örneğin burada .

Evet, anlamadığım şey bu.

 
fxsaber :

Evet, anlamadığım şey bu.

yanlış anlaşılmayı anlamıyorum

Örneğin, özelliklerinden biri başlangıç zamanı (sol kenarlık) olan bir kanalım var. Ve bu kanalı farklı TF'ler üzerine kurmam gerekiyor. Peki, bir süre sonra yeni TF'deki bar numarasını bulmak dışında başka ne alternatifim var?

Evet ve çok daha fazlası.

Örneğin, tüm TF'leri bir logaritmik ölçekle birleştirdiğimde. Bu çok güzel bir konu. Burada da iBarShift analogu olmadan yapamazsınız

 
Nikolai Semko :

Şahsen böyle bir işlevi kullanmanın uygun olduğunu düşünüyorum:

Ancak bunun, en azından Exact parametresine sahip olmadığı için normal MQL4 iBarShift işlevinin tam bir analogu olmadığına dikkat edilmelidir.

Aksi takdirde, aynıdır.

MQL4'te standardın ve bu işlevin tam kimliğini gösteren basit bir komut dosyası ekliyorum.

Normal iBarShift işlevinden ve işlevimden gelen değerler eşit değilse, Yazdır. Hiçbir şey yazdırmadım.

Hayır, Comment() nedeniyle yazdırılmadı

Kaldırırsanız, 1 ile uyumsuzluk var, ancak bunu bir hata olarak görmüyorum çünkü. aslında, yeni bir çubuğun tanımı, yarım çubuk kaydırmalı iki algoritmada gerçekleşir. Yeni bir çubuk tanımlama versiyonum bana normal olandan daha mantıklı görünüyor.

 
Nikolai Semko :

yanlış anlaşılmayı anlamıyorum

Bar kullanmanın amacını anlamıyorum. Kopyalama Oranları , vb.

 

Senaryo neden bu kadar yavaş?

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 );
  }
//+------------------------------------------------------------------+
Neden: