MQL4 Gerçek Zamanlı Saat (saniye saniye) - sayfa 3

 
brewmanz :

A) MT4'ü gerçek zamanlı saat olarak kullanma zahmetine girmeyin. Bu biraz bir köpeği arka ayakları üzerinde gezdirmeye benziyor - yapıldığını görmek ilginç ama aslında pek bir şey yapmıyor.

B) Her saniyeyi işlemek neden bu kadar kritik? Kenelerle pek bir şey olmuyorsa, fiyatlara pek bir şey olmuyor demektir.

(her yorum 1 cent değerinde)


A) Neden yapmayalım! Sadece bilgisayar mı yoksa sunucu zamanı mı; Sanırım doğru bilgi alabiliyoruz.

B) Neden kritik ... bir bakayım- yüksek frekanslı ticaret - kene-kene olduğu asenkron bilgilere dayanmaz! geçerli bir sebep olmalı bence

Hala 2 sentimi bekliyorum.

 
Ais :

MQL4 Referansı : https://docs.mql4.com/runtime/start : "Komut dosyaları ve uzmanlar kendi iş parçacığında çalışır. Özel göstergeler ana arayüz iş parçacığında çalışır."


Yani göstergeniz GUI'deki kullanıcının Arayüzündeki zamanı gösteriyor mu? gerçek zamanlı / saniye saniye.
 

"Saniye saniye" çalışmak için "Sleep()" işlevini kullanırız.

Bunu yapmak için ana rutinin çalışma süresini ölçüyoruz.

Örneğin, çalışma süresinin "int Runtime;" değişkeninde saklanmasına ve "RunTime < 1000" olmasına izin verin.

Ardından "Sleep (1000 - RunTime) ;" öğesini çağırırız. bir sonraki çalıştırmanın elbette verilen hassasiyetle 1000 ms'de gerçekleşmesini sağlamak için.

Ancak.

MQL4 Referansı: https://docs.mql4.com/common/Sleep : "Sleep() işlevi, arayüz iş parçacığında hesapladıkları ve yavaşlatmadıkları için özel göstergelerden çağrılamaz."

 

Basit çözüm:

EA'nıza hesaplamaları ekleyin ve iyisiniz.

Artıları:

icustom'u aramanıza gerek yok

Gösterge yok

Eksileri:

Gösterge Yok. Ancak yüksek frekanslı ticaret için * bir EA kullanmanız * gerekir * çünkü insanlar yavaşlar.

 

"Yüksek frekans" ve "düşük gecikme" biraz farklıdır.

Ayrıca, yalnızca ticaret için değil, genellikle analiz veya izleme için kullanılan görselleştirmeler.

 
Ais :

"Yüksek frekans" ve "düşük gecikme" biraz farklıdır.

Ayrıca, yalnızca ticaret için değil, genellikle analiz veya izleme için kullanılan görselleştirmeler.

Gerçekten izlemeye ihtiyacınız varsa, gösterge davranışını çizgilerle yeniden oluşturabilirsiniz. Elbette yüksek performans farklı bir şey.

 

Olayları zaman aralıkları bazında analiz etmek ve izlemek istersek ne olur?
Örneğin, her 1 saniyede.

 
Ais :

Olayları zaman aralıkları bazında analiz etmek ve izlemek istersek ne olur?
Örneğin, her 1 saniyede bir.

Tik-tik hakkında konuştuğunuz anda ultra yüksek frekans demek ....

'Gelişmiş Fourier dönüşümleri kullanılarak ultra yüksek frekanslı finansal verilerin analizi' (2009) Finance Research Letters Cilt 6, sayfa 47-53 (I.Giampaoli ve WLNg ile)

Önceden tanımlanmış aralıklarla örnekleme, T<t olduğunda yüksek frekanslı örnekleme olarak tanımlanabilir.

 
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Black
#property indicator_color2 Black
#property indicator_color3 Red
#property indicator_color4 Blue
#property indicator_color5 Red
#property indicator_color6 Red
#property indicator_color7 Red
#property indicator_color8 Red
//---- buffers
double open[];
double close[];
double high[];
double low[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
 
extern int MaxHistory= 200 ;
extern int TimeInSeconds= 5 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
double a.open[];
double a.close[];
double a.high[];
double a.low[];
 
int init()
  {
//---- indicators
   SetIndexStyle( 0 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 0 ,high);
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 1 ,low);
   SetIndexStyle( 2 , DRAW_HISTOGRAM , STYLE_SOLID , 5 );
   SetIndexBuffer ( 2 ,open);
   SetIndexStyle( 3 , DRAW_HISTOGRAM , STYLE_SOLID , 5 );
   SetIndexBuffer ( 3 ,close);
   SetIndexStyle( 4 , DRAW_LINE );
   SetIndexBuffer ( 4 ,ExtMapBuffer5);
   SetIndexStyle( 5 , DRAW_LINE );
   SetIndexBuffer ( 5 ,ExtMapBuffer6);
   SetIndexStyle( 6 , DRAW_LINE );
   SetIndexBuffer ( 6 ,ExtMapBuffer7);
   SetIndexStyle( 7 , DRAW_LINE );
   SetIndexBuffer ( 7 ,ExtMapBuffer8);
   ArrayResize (a.high,MaxHistory);
   ArrayResize (a.low,MaxHistory);
   ArrayResize (a.open,MaxHistory);
   ArrayResize (a.close,MaxHistory);      
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void redraw(){
   for ( int i= 200 ;i>= 0 ;i--){
       if (i== 200 ){
      open[i]= 0 ;
      close[i]= 0 ;
      high[i]= 0 ;
      low[i]= 0 ;
      } else {
      open[i]=a.open[i];
      close[i]=a.close[i];
      high[i]=a.high[i];
      low[i]=a.low[i];      
      }
   }
}
 
void shift(){
   for ( int i= 200 ;i> 0 ;i--){
      a.open[i]=a.open[i- 1 ];
      a.close[i]=a.close[i- 1 ];
      a.high[i]=a.high[i- 1 ];
      a.low[i]=a.low[i- 1 ];
   }
}
 
extern int sleep= 100 ;
int start()
  {
   int     counted_bars=IndicatorCounted();
//----
   bool running=true;
   static double price= 0 ;
   static int t= 0 ;
   static datetime t.r= 0 ; 
   static bool updates=false;
   //t=TimeCurrent();
   //while(running){
      updates=false;
       if ( TimeCurrent ()>(t+TimeInSeconds)){
 
         shift();
         if (a.open[ 1 ]==EMPTY || a.open[ 1 ]== EMPTY_VALUE || a.open[ 1 ]== 0 ){
            a.open[ 0 ]=Bid;
            a.close[ 0 ]=Bid;
            a.high[ 0 ]=Bid;
            a.low[ 0 ]=Bid;
         } else {
         a.open[ 0 ]=a.close[ 1 ];
         a.high[ 0 ]=a.close[ 1 ];
         a.low[ 0 ]=a.close[ 1 ];
         a.close[ 0 ]=a.close[ 1 ];
         }
         Print ( "shift " +a.open[ 0 ]+ " - " +a.open[ 1 ]);
         updates=true;
         t= TimeCurrent ();
      }
       if (price!=Bid){
            price=Bid;
            a.close[ 0 ]=price;
            a.high[ 0 ]= MathMax (price,a.high[ 0 ]);
            a.low[ 0 ]= MathMin (price,a.low[ 0 ]);
            updates=true;
      }       
       if (Time[ 0 ]!=t.r){
         t.r=Time[ 0 ];
         redraw();
      } else {
         if (updates){
            redraw();
         }
      }
       if ( IsStopped ()) running=false;
   //   Sleep(sleep);
   //}
//----
   return ( 0 );
  }
uygun uyku işlevini kullanmak için bir EA'ya kolayca yeniden kodlanabilir. Bunu zaten yaptım.
 
zzuegg :
uygun uyku işlevini kullanmak için bir EA'ya kolayca yeniden kodlanabilir. Bunu zaten yaptım.


Güzel program. TimeCurrent(), bilgisayar fiyatını almak için ihtiyacımız olan tek tek fiyattır!

Belki örnekten sentetik bir saat yapabiliriz:

if (Zaman[ 0 ]!=tr){
tr=Zaman[ 0 ];
yeniden çiz();

bize bir ipucu ver! zzuegg :)