Yeni bir çubuk belirtin

 

Yeni bir barın gün ışığını gördüğünü nasıl anlayacağımı biliyorum.
Öncelikle performans konusunda endişeleniyorum. Bazı Sembollerde her 20 ms'de bir keneler gördüm. Tepki vermek için çok zaman yok.

Bir fikir, Rates.tick_volume

Mqlrates rates[1];

OnInit()
    {
    if(CopyRates(_Symbol,_Period,0,1,rates) < 1)
       if(rates[0].tick_volume == 1)
          {
          ... deal with new bar ...
          }

Başka bir fikir , çubuk sayısının artırılıp artırılmadığını kontrol etmek olabilir.

OnInit()
  {
  if(BarsOld < Bars ( _Symbol , _Period ))
     {
     BarsOld = Bars ( _Symbol , _Period );
     ... deal with new bar ...
     }

OnChartEvent'i de kontrol ettim, ancak yeni çubukları diğer şeylerden ayırt etmenin bir yolunu bulamadım.

puan verdiğiniz için teşekkürler

WIllbur

 

Çubuklar ve Hacim, yeni çubuğu algılamak için güvenilir değildir.

Bir bilgisayar nano saniyede çalışıyor, bu nedenle iyi kodlanmış bir EA 20 ms'de çok şey yapabilir.

The "New Bar" Event Handler
The "New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.
 
Bu konuya bakın:
Improve your time execution by removing Bars function calls
Improve your time execution by removing Bars function calls
  • www.mql5.com
After a basic profiling I get the following results :. - - Category: trading systems
 

teşekkür ederim Alain,

çok ilginç ... tam olarak tahmin ettiğim şey . . . 10 kat daha hızlı. ..hmmm.

Anlamı: TimeCurrent() hızlıdır ve çubuk kenarlarına senkronize midir?

Neden .... hmmm ...

Bu konuda biraz zamana ihtiyacım var.

Willbur

 

Tamam - bunun gibi şeyleri sevenler için: Bu konuyla ilgili çalışmam.

Her "OnTick" Etkinliğinde bir dosyaya bir cümle yazdım.

TimeLocal (PC CLock), TimeCurrent(), SymbolInfoTick() kullanılarak gelen son tik hakkında bazı bilgiler ve - CopyRates() kullanılarak - mevcut Bar hakkında bazı bilgiler.


"USD/JPY"den bir örnek - Dönem "M1"dir:

43. dakikanın ilk işareti geldiğinde PC Saati 19:43:01'di, aynı anda yeni bir çıta yükseldi.
Tik hacminin 1 olmadığı gerçeğinin yanı sıra, bu işlerin normal akışıdır.



Bazen o kadar kolay değil - Bu durumda olduğu gibi:

41 dakikalık çubuğun üç işareti daha geldiğinde PC zaten 19:42:00 gösteriyor. Hala 19:41:59 zaman damgası var.

Şimdi dünya derin bir nefes alıyor - 8.150 msn tam bir durgunluk.

Sonra - PC zaten 19:42:09 gösteriyor - yeni çubuğun ilk tik işareti - 42 dakikalık çubuk - içeri giriyor.
Kene 19:42:07 ile işaretlenmiştir ve - onunla birlikte gelen 19:42 çubuğu olduğu için - çubukların zaman damgası 19:42:00'dir.


Şimdi .... hmmm ....

1. TimeCurrent() her zaman kenenin zaman damgasına eşit midir?

40.000 kaydı kontrol ettim ve TimeCurrent'ın halihazırda değiştirildiği ancak son tik işaretinin zaman damgasının değiştirilmediği yalnızca beş vaka buldum.

2. last_tick her zaman yeni çubuğun açılmasının önünde midir?

(devam edecek)

 

TimeCurrent() sunucudan gelen son işaretin zamanıdır , grafik sembolünüzden olup olmaması kodunuza bağlıdır.

"Son tik" sorununuzu anlamıyorum, bu çıktıyı üreten kodu göstermelisiniz.

 

Merhaba Alain

OnTick() içindeki TimeCurrent() öğesini kontrol ediyorum, bu da uğraştığım sembole ait olmasını sağlamalı.

Bu benim "Yeni Çubuk Tanımlayıcım" olmalı - küçük ve hızlı - ne düşünüyorsunuz?

//---  New Bar           
bool   NewBar = false;
long   currPeriodSeconds;
double currPeriodProgress = 0;

int OnInit(void)  //-----------------------------------------------
{
      currPeriodSeconds = PeriodSeconds();
      return(INIT_SUCCEEDED);
}

void OnTick()  //--------------------------------------------------
{
      if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
           NewBar = true;
      else NewBar = false;
     

      currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);

Bu sequenz ile kontrol edeceğim:

//---  Just for testing
int    ExtHdlFile1=0;
       MqlRates rates[1];
        
//---  New Bar           
bool   NewBar = false;
long   currPeriodSeconds;
double currPeriodProgress = 0;

int OnInit(void) // -------------------------------------------------------
{
      currPeriodSeconds = PeriodSeconds();

      ExtHdlFile1=FileOpen("NewBarTest.csv",FILE_READ|FILE_WRITE|FILE_CSV);
      FileSeek (ExtHdlFile1,0,SEEK_END); 
      FileWrite(ExtHdlFile1,  "TimeLocal",
                              "TimeCurrent",
                              "rates[0].time",
                              "rates[0].tick");
      return(INIT_SUCCEEDED);
}

void OnTick() // -----------------------------------------------------------
{
      if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
           NewBar = true;
      else NewBar = false;
     
      currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);

//--- lets check this

      if(NewBar)
         {
         // last Time Stamp of old Bar
         FileWrite(ExtHdlFile1, " ",
                                " ",
                                TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
                                IntegerToString(rates[0].tick_volume));
         // get the new bar                     
         if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return;
         // first Time Stamp of new Bar       
         FileWrite(ExtHdlFile1,TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS),
                               TimeToString(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
                               TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
                               IntegerToString(rates[0].tick_volume));
         }

      if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return; // != clean code - just a test
}

void OnDeinit(const int reason)
{
      FileClose(ExtHdlFile1);
      return;
}

 
Willbur :

Merhaba Alain

OnTick() içindeki TimeCurrent() öğesini kontrol ediyorum, bu da uğraştığım sembole ait olmasını sağlamalı.

Pekala, bu benim "Yeni Çubuk Tanımlayıcım" olmalı - küçük ve hızlı - ne düşünüyorsunuz?

İlginç, ama evrensel olduğunu düşünmüyorum (her durumda işe yarıyor)... Kontrol edeceğim , şu anda zaman yok.
 
 

İşte benim son versiyonum .

Aslında biraz endişeliyim çünkü çok kolay.

Alain: Kutsamayı yayınlarsan iyi olur.

// -----------------------------------------------------------------------
bool NewBar(void)
{
bool iNewBar = false;
static double currPeriodProgress = 0;

   if(MathMod(TimeCurrent(),PeriodSeconds()) < currPeriodProgress) iNewBar = true;

   currPeriodProgress = MathMod(TimeCurrent(),PeriodSeconds());

   return(iNewBar);
}
// ------------------------------------------------------------------------
void OnTick()
{
    if(NewBar())     PlaySound("tick.wav");


Köln'den selamlar
Willbur

 

En kolay yol:

statik tarihsaat tlastbar=0;

tarihsaat tnewbar=iTime(NULL,PERIOD_CURRENT,0);

bool isnewbar=tnewbar!=tlastbar;

tlastbar=tnewbar;