iBarShift'e benzer - sayfa 6

 
Vasiliy Pushkaryov :

TimeCurrent () gibi özel bir durum elimize geldi.

Şimdi Bars () işleviyle ilgili bu notu daha dikkatli okudum:

"Belirli bir tarih aralığındaki çubuk sayısı istenirken sadece açılış saati bu aralıkta olan çubuklar dikkate alınır . Örneğin, haftanın geçerli günü Cumartesi ise, o zaman ile haftalık çubuk sayısı istenirken start_time=last_Tuesday ve stop_time=last_Friday, haftalık zaman dilimindeki açılış saati her zaman Pazar gününe denk geldiğinden ve haftalık tek bir çubuk belirtilen aralıkta olmadığı için işlev 0 döndürür."

TimeCurrent() zamanı, geçerli çubuğun açılış zamanından hemen hemen her zaman daha sonra olduğundan, bu nedenle, Bars() işlevi 0 döndürür. Saatlik zaman diliminde 02:05'e karşılık gelen zamanı geçersek, start_time parametresini seçin ve çubuğun bize yatırılmasını istiyorsanız, saat 2'de başladı, ardından CopyTime( ) aracılığıyla çubuğun açılış saatini (02:00:00) almanız gerekir. Aksi takdirde , Bars() işlevi bu çubuğu yok sayar.

Onlar. şimdi saat 3:30 ise, saatin saat diliminde 2:05'in indeks 1'e sahip çubuğa atıfta bulunduğunu anlıyorum. Bu indeks 2. sayfadaki hiçbir fonksiyon tarafından döndürülmeyecek. Bu değişiklikle Renat Akhtyamov işlevi beklediğimi döndürdü.

Test olarak kullandığım dizin arama işlevleri için 4 seçenekli bir komut dosyası ekliyorum.

Sunulan işlevi denedim, grafikte olmayan bir zamana sahip bir çubuk istendiğinde bir çubukla uzandığı ortaya çıktı. Onlar. günün ilk çubuğunu bilmek istiyorsak ve "03/28/2018 00:00" saatini talep ediyorsak, ancak böyle bir zamana sahip bir çubuk yoksa, bir öncekinin son çubuğunun indeksini alacağız. gün.

Yoksa bu şekilde mi amaçlandı?

 
Aleksey Vyazmikin :

Sunulan işlevi denedim, grafikte olmayan bir zamana sahip bir çubuk istendiğinde bir çubukla uzandığı ortaya çıktı. Onlar. günün ilk çubuğunu bilmek istiyorsak ve "03/28/2018 00:00" saatini talep ediyorsak, ancak böyle bir zamana sahip bir çubuk yoksa, bir öncekinin son çubuğunun indeksini alacağız. gün.

Yoksa bu şekilde mi amaçlandı?

Bir dize olarak zamanı nasıl geçirirsiniz?
 
Renat Akhtyamov :
Bir dize olarak zamanı nasıl geçirirsiniz?

Ve bir satırla denedim ve o zamandan beri daha önce yayınlanan kodda.

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

Ve bir satırla denedim ve o zamandan beri daha önce ortaya konan kodda.

o sahip

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

yani false varlığı tamamen açık değildir

ve öyle olsa bile:

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

Bu koda karar vermiş olsam da, hızlı bir şekilde çalışıyor gibi görünüyor:

 //+------------------------------------------------------------------+ 
//| Получим 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);
  }  

Bu kodda herhangi bir eksiklik bulan var mı, yoksa daha hızlı bir seçenek var mı?

Ve, şey, tek olumsuz şey, henüz grafikte olmayan bir çubuk için talepte bulunmanızdır, yani. örneğin bugünün zamanı ile .... belki bu bir şekilde çözülebilir? Bilinen son çubuğu döndürmek mantıklı olacaktır. Bu, geçerli zamanda çalışan algoritmalarla çalışmakla ilgili olabilir.

 
Renat Akhtyamov :

o sahip

yani false varlığı tamamen açık değildir

false - standardizasyon için hiçbir şeyi etkilemez :) Dürüst olmak gerekirse, bazı işlevlerde bu false'a neden ihtiyaç duyulduğunu bilmiyorum?

 
Aleksey Vyazmikin :

Bu koda karar vermiş olsam da, hızlı bir şekilde çalışıyor gibi görünüyor:

Bu kodda herhangi bir eksiklik tespit eden var mı, yoksa daha hızlı bir seçenek var mı?

Ve, şey, tek olumsuz şey, henüz grafikte olmayan bir çubuk için talepte bulunmanızdır, yani. örneğin bugünün zamanı ile .... belki bu bir şekilde çözülebilir? Bilinen son çubuğu döndürmek mantıklı olacaktır. Bu, geçerli zamanda çalışan algoritmalarla çalışmakla ilgili olabilir.

var olmayan bir çubuk numarasını döndürmek iyi değil

geri dönmek daha kolay -1

 
Aleksey Vyazmikin :

false - standardizasyon için hiçbir şeyi etkilemez :) Dürüst olmak gerekirse, bazı işlevlerde bu false'a neden ihtiyaç duyulduğunu bilmiyorum?

Orada kayboldum ve iki nokta üst üste olmayan basit kodların takipçisiyim
 
Renat Akhtyamov :

var olmayan bir çubuk numarasını döndürmek iyi değil

geri dönmek daha kolay -1

Hayır, sadece bilinen son çubuğu döndürmeniz gerekiyor, yani. indeks 0 ile ve şimdi uzun süre oraya ne döneceğini düşünüyor.

İşte bir çubuk yanlış olan kod, doğru çubuğu döndürür - sıfır.

Yoksa tarihte bir bar istendiğinde var olmadığı gerçeğinden mi bahsediyorsunuz? O zaman, çoğu zaman, zamanımıza en yakın olan çubuğu var olanlardan almanız gerektiğini düşünüyorum ve bu durumda kod, geçmişte -1 ofseti olan bir çubuk döndürür, ancak yoksa doğru çalışır. daha fazla geçmiş - hızlı bir şekilde sıfır çubuğu döndürür.

 
Aleksey Vyazmikin :

Hayır, sadece bilinen son çubuğu döndürmeniz gerekiyor, yani. indeks 0 ile ve şimdi uzun süre oraya ne döneceğini düşünüyor.

İşte bir çubuk yanlış olan kod, doğru çubuğu döndürür - sıfır.

Yoksa tarihte bir bar istendiğinde var olmadığı gerçeğinden mi bahsediyorsunuz? O zaman, çoğu zaman, zamanımıza en yakın olan çubuğu var olanlardan almanız gerektiğini düşünüyorum ve bu durumda kod, geçmişte -1 ofseti olan bir çubuk döndürür, ancak yoksa doğru çalışır. daha fazla geçmiş - hızlı bir şekilde sıfır çubuğu döndürür.

Evet (vurgulanmış)

-1 eksi (belirtilecek) olan bir birimdir, fonksiyon tarafından döndürülen hata böyle bir çubuk olmadığını gösterir

bu benim işlevim

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

iBarShift'e benzer

Renat Akhtyamov , 2017.06.08 01:19

Eh, bu da mümkün

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

ayrıca iyileştirmeye ihtiyacı var

rağmen...

Belgeler:

" not

Bars() işlevi çağrılırken belirtilen parametrelere sahip zaman serisi verileri henüz terminalde oluşturulmadıysa veya zaman serisi verileri, işlev çağrısı sırasında ticaret sunucusuyla senkronize edilmemişse, o zaman işlev null döndürür. "

====

res==0 ise, fonksiyondan -1 yakalarız.

===

Yani her şey çalışıyor, sağlığınız için kullanın!

Neden: