Yerel saat ile taze kene saati arasında bir buçuk dakikalık fark. Ne yapalım. - sayfa 2

 
prostotrader :

Yorumları olan bir kaynak kodu var.

Bakmak için çok tembel misin? Ya da bir şey net değil mi?

Baktı. Fikri kod olmadan aldım. Bana neden tavsiyede bulunduğun açık değil:

basit tüccar :

Piyasa İzleme'ye en likit enstrümanları eklemeniz gerekir.

Ardından bu aletlerin bardaklarını ekleyin.

Ve OnBookEvent() tetiklendiğinde, 1 tik (son) kopyalayın, zaman olacak ve hemen yerel saati alıp karşılaştırın.

Yönteminiz neden daha iyi?

 
pivomoe :

Baktı. Fikri kod olmadan aldım. Bana neden tavsiyede bulunduğun açık değil:

Yönteminiz neden daha iyi?

Çünkü o haklı!

Yerel saat değil, sunucu saati hatası yaptım .

1. Keneler toplu olarak terminale gelir.

2. Sonraki her paket, bir önceki pakete "istiflenmemiş" ancak bir öncekiyle aynı zamana sahip olan onay işaretleri içerebilir.

3. OnBookEvent(), herhangi bir tıklamanın (fiyattaki, hacimdeki değişiklik), yani her bir tıklamanın gelmesiyle tetiklenir. (zamanlayıcıyı başlatırsınız - zaten kötü).

4. Bilgisayarın yerel saatini kullanıyorsunuz, bu hiç gerekli değil!

 

Aslında, ticaret için gerekli olan tek şey budur (ticaret seans sürelerini kontrol etme)

 //+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
int is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
  is_book = MarketBookAdd ( Symbol ());
   if (is_book == false ) return ( INIT_FAILED );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_book == true ) MarketBookRelease ( Symbol ()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent ( const string &symbol)
{
   if (symbol == Symbol ())
  {
     if (CheckMarketTime() == true )
    {
     //Торговое время
     //Наш код
    }
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
bool CheckMarketTime()
{
   MqlDateTime cur_time, sv_time;
   MqlTick ticks[];
  cur_time.year = 0 ;
   TimeTradeServer (cur_time); //Возвращает расчетное текущее время торгового сервера.
   if (cur_time.year > 0 )
  {
     int result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
       if ( TimeToStruct (ticks[ 0 ].time, sv_time) == true )
      {
         if (sv_time.day_of_year == cur_time.day_of_year)       //Проверка, что это сегодняшний тик
        {
           ulong tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec;
           if (((tr_time >= 3600 ) && (tr_time < 50370 )) ||   //10:00:00 - 13:59:30
             ((tr_time >= 50700 ) && (tr_time < 67470 )) ||   //14:05:00 - 19:44:30 
             ((tr_time >= 68700 ) && (tr_time < 85770 )))     //19:05:00 - 23:49:30
          {
             return ( true );
          }
        }
      }
    }
  }   
   return ( false );
} 

Katma

Milisaniye hassasiyete ihtiyacınız varsa, o zaman

 double t_msc = double (ticks[ 0 ].time_msc - ulong (ticks[ 0 ].time) * 1000)/ 1000 ; //Получаем в секундах
double tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec + t_msc;

Katma

Ancak tüm bunlar istenen sonucu vermeyecektir (ticaret zaman sınırları), çünkü

keneler işlem seansında olmayabilir ve zaman durmaz.

Birinin bekleyen emrini kaldırdığını varsayalım, emir defteri değişti,

bir sinyal var ve "eski" bir düzeltme var (zaman geçerli değil).

Terminal, sunucunun tam saatini yayınlamaz .

 

Beni anlamıyorsun. Hadi baştan başlayalım.

1) Programda TimeCurrent() fonksiyonunu çağırırsınız ve Market Watch'ta seçilen sembollerden biri için son fiyat teklifinin varış zamanını alırsınız.

18:00:00 olsun

2) Bir sonraki komutla, son SBER kenesinin zamanını alırsınız.

17:58:00 olsun

3) Biraz zaman geçer ve yine son SBER işaretinin zamanını istersiniz.

17:59:00 olsun


Dikkat sorusu: 18:00:00 TimeCurrent() saatinin 17:59:00 saatiyle keneyi bilmemeyi normal buluyor musunuz?

 
pivomoe :

Beni anlamıyorsun. Hadi baştan başlayalım.

1) Programda TimeCurrent() fonksiyonunu çağırırsınız ve Market Watch'ta seçilen sembollerden biri için son fiyat teklifinin varış zamanını alırsınız.

18:00:00 olsun

2) Bir sonraki komutla, son SBER kenesinin zamanını alırsınız.

17:58:00 olsun

3) Biraz zaman geçer ve yine son SBER işaretinin zamanını istersiniz.

17:59:00 olsun


Dikkat sorusu: 18:00:00 TimeCurrent() saatinin 17:59:00 saatiyle keneyi bilmemeyi normal buluyor musunuz?

Verdiğim kodda tüm keneleri hesaba katabilirsiniz (sorun değil)

Son kod TineCurrent()'i kullanmaz, ancak TimeTradeServer()'ı kullanır - bu sefer yalnızca

GÜN'e kadar keneyi kontrol etmek için ve işte bu kadar!

Baştan başlayalım.

Genel olarak, ne yapmak istiyorsun, öğren?

Neden tik saatini yerel saatle karşılaştırmaya başladınız?

Orijinal hedef nedir?

 

Şimdi bu sorunun pratikte nasıl göründüğünü göstereceğim. Danışmanı tamamen yeniden düzenledim . Hem OnTimer'da hem de OnBookEvent'te yeni keneler yakalamayı mümkün kıldı.

Piyasaya genel bakışta 45 sembol var. Çoğu sıvı değildir.

OnBookEvent'te yeni keneler yakalamanın sonucu:

РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 494013 милесекундa.

CR       0        18 : 51 : 47.334     ProverkaAktyalnostiTikov (ALRS,H1)       Получен НОВЫЙ тик по символу                     SNGR- 3.19 time_msc= 2019.03 . 18 18 : 41 : 47.988

HN       0        18 : 51 : 47.335     ProverkaAktyalnostiTikov (ALRS,H1)       ХОТЯ до этого был получeн тик                        ARMD time_msc 2019.03 . 18 18 : 50 : 02.001

Yani 18:50 TimeCurrent saatinde SNGR- 3.19 sembolüne 18:41 ile yeni bir tik takılmıştır.


Sırada, bilgisayarın o andaki yerel saatinin ölçümleri var:


1) yeni bir onay işareti almak, yani CopyTick'e (veya ayarlara bağlı olarak SymbolInfo'ya) son çağrı anında

2) Sondan bir önceki arama anında.

 18 : 51 : 47.335     ProverkaAktyalnostiTikov (ALRS,H1)       Локальное время получения нового тика по символу.                       2019.03 . 18 18 : 51 : 47.334

18 : 51 : 47.335     ProverkaAktyalnostiTikov (ALRS,H1)       Предпоследние Локальное время попытки получить новый тик по символу     2019.03 . 18 18 : 41 : 47.204


Diğer bir deyişle, bu durumda sorun, yenisini alma işlevinin 10 dakika boyunca çağrılmaması nedeniyle meydana geldi .... Ve bu, SNGR- 3.19 sembolü için OnBookEvent olayının 10 dakika boyunca oluşturulmaması nedeniyle oldu .

Muhtemelen terminal onu olay kuyruğuna koydu, bir şekilde bu kuyruktan kayboldu. OnTimer ile böyle bir pervaz yoktur. Evet, bazen 20 saniyelik bir gecikmeyle bir kene gelir.


 
pivomoe :


Asıl hedefiniz nedir?

Neden tiv saatini yerel saatle karşılaştırmanız gerekiyor?

 
prostotrader :

Asıl hedefiniz nedir?

Neden tiv saatini yerel saatle karşılaştırmanız gerekiyor?

Sunucuda bir işaret oluştuğu an ile terminale geldiği zaman arasındaki maksimum gecikmeyi bilmek istiyorum. Ve bu süre nasıl en aza indirilebilir?

Bu bilgi, kendi test cihazınızı yazarken kullanılabilir. Hatta geliştiricileri büyük gecikmelerle şaşırtabilir.

TimeCurrent() - Son sembol işaretinin zamanı, gecikme süresinden daha az olacaktır, bu nedenle kullanılabilir. İlk sürümde yerel saati kullanmak iyi bir fikir değildi.

 
pivomoe :

Sunucuda bir işaret oluştuğu an ile terminale geldiği zaman arasındaki maksimum gecikmeyi bilmek istiyorum. Ve bu süre nasıl en aza indirilebilir?

Bu bilgi, kendi test cihazınızı yazarken kullanılabilir. Hatta geliştiricileri büyük gecikmelerle şaşırtabilir.

Açık. Bensiz devam et.

Diğer forum üyeleri için

 //+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK
};
//
int is_book;
ulong last_tick_time; //Время последнего тика
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
  last_tick_time = 0 ;
  is_book = MarketBookAdd ( Symbol ());
   if (is_book == false ) return ( INIT_FAILED );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_book == true ) MarketBookRelease ( Symbol ()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent ( const string &symbol)
{
   if (symbol == Symbol ())
  {
     MqlTick a_ticks[];
     int result = CopyTicks (symbol, a_ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
      FRESH_TICK tick_state = CheckTickTime(a_ticks[ 0 ]);
       switch (tick_state)
      {
       case UNKNOWN_TICK:; //Тик не определен
       break ;
       case NEW_TICK:;     //Торговое время, можно отсылать ордера;
       break ;
       case CUR_TICK:;     //По усмотрению разработчика;
       break ;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime( MqlTick &a_tick)
{
   MqlDateTime cur_time, tick_time;
  cur_time.year = 0 ;
   TimeTradeServer (cur_time); //Возвращает расчетное текущее время торгового сервера.
   if (cur_time.year > 0 )
  {
     if ( TimeToStruct (a_tick.time, tick_time) == true )
    {
       if (tick_time.day_of_year == cur_time.day_of_year)       //Проверка, что это сегодняшний тик
      {
         double t_msc = double (a_tick.time_msc - ulong (a_tick.time) * 1000 )/ 1000 ;
         double tr_time = double (tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec) + t_msc;
         if (((tr_time >= 36000 ) && (tr_time < 50370 )) ||   //10:00:00 - 13:59:30
           ((tr_time >= 50700 ) && (tr_time < 67470 )) ||   //14:05:00 - 19:44:30 
           ((tr_time >= 68700 ) && (tr_time < 85770 )))     //19:05:00 - 23:49:30
        {
           if ( ulong (a_tick.time_msc) > last_tick_time)
          {
            last_tick_time = ulong (a_tick.time_msc);
             return (NEW_TICK);
          } else return (CUR_TICK);  
        }
      }
    }
  }   
   return (UNKNOWN_TICK);
} 
      
 
pivomoe :

Dikkat sorusu: 18:00:00 TimeCurrent() saatinin 17:59:00 saatiyle keneyi bilmemeyi normal buluyor musunuz?

Bence konu tartışılabilir. Onay dizisinin en azından aşağıdaki kriterleri karşılamasını istiyorum:

1. Tutarlıydı, yani sonraki her bir tıklamanın zamanı >= bir önceki tıklamanın zamanı;

2. Uygunluk. Onlar. mevcut ana mümkün olduğunca yakın olan son gelen kene zamanı;

Sorununuz ikinci noktayla ilgili gibi görünüyor.

2. maddenin tartışılabilirliği şu şekildedir: Sunucuda bir onay işaretinin oluşmasından onu aldığım zamana (gecikme) kadar geçen sürenin minimum olmasını istiyorum, böylece diğerlerinden daha hızlı işleyebilir ve bir ticaret kararı verebilirim. Ancak! Tüm teklif sahipleri için gecikme aynıysa, o zaman sorun yok (anladığım kadarıyla). Onlar. aracının sunucusunda bir sorun var ama her şey eşit düzeyde. Birisi 17:59:00'da 17:59:01'de kene hakkında bilgi aldıysa ve ben 18:00'de bile almadıysam - bu büyük bir problem.

Ve işte soru. Sorun nedir (ve var mı)? Uzun süre (herkese) onay vermeyen broker sunucusunda veya uzun süre almayan MT5'te.

Neden: