zaman damgalarında milisaniye sağlayan yeni mql4 .... - sayfa 3

 

Herşey,

Buradaki soru, önerildiği gibi GetTickCount() (yani start() işlevi çağrıldığında) kullanılarak kenenin terminale geldiği zamanı değil, kenenin zaman damgasını almaktır.

MarketInfo(Symbol(), MODE_TIME), veri akışında aracının sunucusundan gönderildiği şekliyle onay işaretinin zaman damgasını döndürür.

Saygılarımızla

VS

 
AnkaSoftware :

Herşey,

Buradaki soru, önerildiği gibi GetTickCount() (yani start() işlevi çağrıldığında) kullanılarak kenenin terminale geldiği zamanı değil, kenenin zaman damgasını almaktır.

MarketInfo(Symbol(), MODE_TIME), veri akışında aracının sunucusundan gönderildiği şekliyle onay işaretinin zaman damgasını döndürür.

Ne yazık ki bu sadece 1 saniyelik bir hassasiyette olacaktır.
 
ubzen :

1) GetTickCount(), Canlı çalışmalıdır. Tarihsel veriler üzerinde anlamsız.

2) mt5_data bile milisaniye cinsinden kaydedilmez. Ancak, no_problem Live.

3) Bununla nereye varacağınızı anlamıyorum. Milisaniye cinsinden aynı zamansa, milisaniyeye sahip olmak yardımcı olmaz. Milisaniye cinsinden farklı zamanlar ise GetTickCount() yardımcı olabilir. Kodunuzun mevcut onay işaretini bir milisaniyeden daha kısa sürede işlemesi anlamında yardımcı olun. Her şeyin ne kadar önemli olduğu, neyi başarmaya çalıştığınıza bağlıdır... sanırım.


Cevapları için herkese teşekkürler. Kod tabanına gönderilen bir gösterge vardı, Rogue Tick Detector. Ama henüz onaylanmadı. Şimdilik burada bulabilirsiniz.

Temel fikir, mevcut tik tik0'ın önceki tik tik-1'den daha sonraki bir zaman damgasıyla geleceği zamanlar olmasıdır. Ancak fiyat artık üzerinde işlem yapılamaz, ancak EA veya insan tüccarı, olay bitene kadar bunu bilemezdi. Fiyat bazlı olayların hatalı tetiklenmesine neden oluyordu. Hileli tik detektörü bu sahte keneleri işaretleyebildi ve EA'nın bunlar üzerinde hareket etmesini engelledi (bir sonraki 'iyi' onay işaretini bekleyin)

İşaretlerin zaman damgalarını yakalamanın mevcut yöntemi olan MarketInfo(Symbol(), MODE_TIME), milisaniyelik zaman damgalarını döndürmez. Bu yüzden, gözden kaçırdığımız alternatifler olup olmadığını görmek için buraya geldim.

Hileli kene algılama işlevlerini içeren EA'ların tümü, New York'ta SSD sürücüler, Windows 2008 ile VPS üzerinde çalışır ve genellikle aracı sunucusundan <2 ms'dir. HFT veya aşırı ölçeklendirme yok (işlemlerin ortalama tutma süresi yaklaşık 1 saattir)

Beni asıl sorularımdan birine geri getiriyor: Peki mt4 (ve mt5) platformunun [kendisinin] 'aynı anda' gelen onay işaretlerini nasıl düzgün bir şekilde ayırt etmesi gerekiyor?

düzenleme, açıklama için teşekkürler ankasoftware.

 
4evermaat :


Beni asıl sorularımdan birine geri getiriyor: Peki mt4 (ve mt5) platformunun [kendisinin] 'aynı anda' gelen onay işaretlerini nasıl düzgün bir şekilde ayırt etmesi gerekiyor?

Yapamazsın . . . Broker'ınız aslında size aynı anda gerçekleşen birden fazla onay gönderiyor mu? yoksa sadece sayıyı 2 artırıp ikinci onay işaretini mi gönderiyorlar? yapıp yapmadıklarını nasıl bilebilirsin? Komisyoncular arasında kene sayısında büyük bir fark olduğunun farkında mısınız?
 
RaptorUK :
Yapamazsın . . . Broker'ınız aslında size aynı anda gerçekleşen birden fazla onay gönderiyor mu? yoksa sadece sayıyı 2 artırıp ikinci onay işaretini mi gönderiyorlar? yapıp yapmadıklarını nasıl bilebilirsin? Komisyoncular arasında kene sayısında büyük bir fark olduğunun farkında mısınız?


Evet, farklı brokerlerin farklı beslemeleri olduğunun ve onay sayısının büyük ölçüde farklılık gösterebileceğinin farkındayım. Ancak öyle olur ki, hileli keneler belirli zamanlarda, özellikle de alım satımların kârla kapatıldığı zamanlarda gönderilir. Kapanışların ve siparişlerin tetiklenmesini etkiliyordu, bu yüzden elimizden geldiğince onları tespit edip yok saymanın bir yolunu bulduk. Hatta bir noktada bazı brokerlerin kasıtlı yem manipülasyonundan bile şüphelendim.

Ama belki de toplam keneleri saydığımız bir kene sayım oranına sahip olmalıyız.

Pek çok insanı etkilemeyebilir, ancak potansiyel hasarın daha fazla araştırmayı garanti altına almak için yeterli olduğunu düşündüm.

 
Şu anda [bildiğim kadarıyla] tam olarak istediğinizi yapan herhangi bir işlev/süreç yok.
4evermaat : Ama belki de toplam keneleri saydığımız bir kene sayım oranına sahip olmalıyız.

Aklında ne var? Bunun mt4 Volume'den farkı ne olabilir? Hangi iki sayının oranı [saymak ve ??? ].

Bu konu çok çabuk çok kafa karıştırıyor. Ben de dahil, keneler hakkında her şeyi bilmiyorum, metaQuotes'un bunu nasıl işlediğini veya birisi için neden çok kritik olacağını bilmiyorum. Bazı gözlemlerimi özetlememe izin verin.

1) metaQuotes diyor ki: mili_saniye zaman_stamp istiyorsun, [hemen tick_data düşünmeye başlarlar], bu tick_data'yı komisyoncu kim tutacak? Yani o dakika içinde 200 tik olduğunu söylemek senin için yeterince iyi değil mi? OHLC+V yeterince iyi olmadığı için gerçekten 200 veri girişi kaydetmemizi mi istiyorsunuz?

2) tüccar numarası1 diyor ki: Bilgiyi kaydetmek için kimseye ihtiyacım yok, sadece eski verileri belirlemek için mili_saniyelik zaman damgası istiyorum.

3) 2 numaralı tüccar diyor ki: Bilgileri bana kaydetmenize ihtiyacım yok, sadece bana aktarma yeteneği verin, ben de kendi verilerimi alayım.

4) tüccar numarası3 diyor ki: Kene verilerini kaydetmenin ve sağlamanın neden bu kadar önemli olduğunu anlamıyorum. Hadi ama, bugünlerde bilgisayarların daha fazla gücü ve hafızası var, kesinlikle aracım verileri bir yerden sağlayabilir.

5) komisyoncu diyor ki: adamım, 3_aydan fazla bir süredir size m1 verisi vermekte yeterince zorlanıyorum, bağlandığınızda veya test için bu kadar çok veri sağlamaya yetenekli veya istekli olduğumu düşündüren şey.

6) tüccar numarası4: test için buna ihtiyacımız yok ve veriler için sadece küçük bir kısım canlı olarak yeterli olacaktır, yetersiz m1'den şikayet etmiyorum şimdi sorun ne.

7) metaQuotes: hala çalışmıyor, bu, mili_saniye ve göstergeler döndüren ve keneleri ayırt eden işlevleri kolaylaştırmamız gerektiği anlamına geliyor ... terminali çökertmeye mi çalışıyorsunuz?

8) tüccar numarası5: Hacmin pazar_derinliği değil, belirli bir zaman çerçevesi içindeki kenelerin sayısı olduğunu kastediyorsunuz :) . Keneyi kaçırabileceğimi mi söylüyorsun? Siber uzayda kenelerin kaybolabileceğini veya gecikebileceğini mi söylüyorsunuz? Komisyoncular arasında tick_count farkı mı demek istiyorsun? Yani komisyoncunun sakladığı veriler benim aldığımla aynı olmayacak mıydı? O zaman kene ile ilgili tüm bu yaygara nedir?

9) xxxxxxxxxxxx diyor ki: kene çok gizlidir, sağlananlar kesinlikle yeterince iyidir, kene oluşturucunun tasarımına yardım ettim ve bu tür bir çözüm sağlamaya çok az ilgim var. olmayacak .... dönem.

10) tüccar numarası6: Nelerin sağlanabileceği, kene sayımlarının nasıl çalıştığı, nelerin alınabileceği vb. konularda teknolojik sınırlamalar vardır. Bu bir metaTrader sorunu değil, birçok perakende platformu bu sorunu yaşıyor. Kurumsal yazılımlara bakın ve büyük paralar kazanmaya hazır olun.

Tüccar#3'ten Tüccar#10'a: katılmıyorum.

Ubzen diyor ki: Artık ne diyeceğimi bilemiyorum.

Ps> neredeyse 7 numaralı tüccarı unuttum: tamam, terminalime gelen kendi tick'imi kaydedeceğim ve kendi göstergelerimi ve bu verileri işlemek için programlayacağım... Soruyu bu şekilde yorumladım ve bu nedenle GetTickCount'u tavsiye ettim. ().

 
ubzen :

Ps> neredeyse 7 numaralı tüccarı unuttum: tamam, terminalime gelen kendi tick'imi kaydedeceğim ve kendi göstergelerimi ve bu verileri işlemek için programlayacağım... Soruyu bu şekilde yorumladım ve bu nedenle GetTickCount'u tavsiye ettim. ().

Ne yazık ki bu hala cevapsız kenelerle başa çıkmıyor. . . pratikte kendi kenelerinizi kaydetmeniz imkansızdır, hepsini elde edemezsiniz ve bazılarını kaçıracağınız için, bu gerçek kaydedilmedikçe kaydedilen veriler yanlış olacaktır, bu nedenle potansiyel olarak yararsızdan daha kötü, yanıltıcı olacaktır.
 
RaptorUK : Ne yazık ki bu hala kaçırılan kenelerle başa çıkmıyor . . . pratikte kendi kenelerinizi kaydetmeniz imkansızdır, hepsini elde edemezsiniz ve bazılarını kaçıracağınız için, bu gerçek kaydedilmedikçe kaydedilen veriler yanlış olacaktır, bu nedenle potansiyel olarak yararsızdan daha kötü, yanıltıcı olacaktır.

Burada gündemde kalmayı umuyorum :). Bununla birlikte, her tik ile milisaniyelik timeStamps gönderen bir komisyoncu hayal edin. Ancak, bu bilgiyi her_side'a kaydetmemeye devam edin. Genel olarak komisyoncular hakkındaki tüm güvensizlik göz önüne alındığında, bu komisyoncu bir soruşturma saldırısı başlatır. Ancak bu sefer insanların milisaniye cinsinden kanıtları var, ancak komisyoncunun karşı koyacağı hiçbir kaydı yok. Yani bir anlamda tick_data istemek | milisaniye veya aynı argümanlara yol açan her neyse, temelde aracıdan tick_data'yı kaydetmesini ve platformun bunu kolaylaştırmasını istemektir.

İkinci bir notta, çoğu kişinin yaptığı ters geriye dönük testleri düşünün. Yaklaşık bir hafta boyunca bir strateji_canlısı çalıştırdığınız ve ardından aynı sonuçları alıp alamayacağınızı doğrulamak için o hafta in_order için bir back_test gerçekleştirmeye devam ettiğiniz yer. Bu kişinin milisaniyelik time_stamps canlı ve gecikmeler ve eksik paketler var. Tabii ki orijinal posterde olduğu gibi, eksik verileri görmezden gelirsiniz ve/veya gecikmiş onay işaretlerini reddedersiniz. Ancak, geriye dönük testi gerçekleştirdiğinizde, aracının tüm verileri doğru zaman damgalarıyla birlikte oradadır. Bu, açıkça, az önce canlı olarak aldığınızdan farklı sonuçlar üretecektir.

Öyleyse söyle bana, Live'ı mı yanlış yönlendirdin yoksa Back_Test sırasında mı yanlış yönlendiriliyorsun?

Ancak yukarıdaki ifadenize katılıyorum . Imo, tüm bunlar beni dakikalar arası süreçlerden hep birlikte uzak durmaya yönlendiren bir dizi paradoks yaratıyor. Platformun sınırlamaları var, sadece kabul ediyorum ve hareket ediyorum.

 
ubzen :
...

Ancak yukarıdaki ifadenize katılıyorum . Imo, tüm bunlar beni dakikalar arası süreçlerden hep birlikte uzak durmaya yönlendiren bir dizi paradoks yaratıyor. Platformun sınırlamaları var, sadece kabul ediyorum ve hareket ediyorum.

;-)
 

Beni Windows için Mikrosaniye Çözünürlük Süresi Hizmetlerine yönlendiren ilginç bağlantılar teşekkür ederim. Bu sayfalardaki bilgilere dayanarak bazı testler yaptım.

Win 7 PC ve Windows 2012 VPS'deki testlerim, GetTickCount()'un sistem zamanlayıcı ayarından bağımsız olarak her zaman 15.6 msn (saniyede 64 kesme) çözünürlüğe sahip olduğunu gösterirken, kernel32.dll'yi çağırarak milisaniyelik süre elde ederken çözünürlük GetSystemTime() [veya GetLocalTime()] veya GetSystemTimeAsFileTime() işlevleri, sistem zamanlayıcı ayarlarından etkilenir ve test ettiğim her iki makinede 0,5 msn'ye kadar çözünürlük verebilir.

GetTickCount() Çözünürlük

GetTickCount() çözünürlüğünü test etmek için bir komut dosyasının kodu:

 // Script to test Millisecond Resolution via GetTickCount ()

void OnStart () {
   uint startMsecsU = GetTickCount (), nowMsecsU;
   for ( int j= 0 ; j< 1000000000 ; j++) {
     if ((nowMsecsU = GetTickCount ()) > startMsecsU) {
       MessageBox ( StringFormat ( "GetTickCount %u -> %u diff %u" , startMsecsU, nowMsecsU, nowMsecsU - startMsecsU), "Test Millisecond Resolution via GetTickCount" );
       return ;
    }
}

Bu, diğer testler için aşağıda belirtilen sistem zamanlayıcı çözünürlük değişikliklerinden bağımsız olarak test edilen her iki makinede her zaman 15 veya 16 (yani 15,6) verir.

GetSystemTime() Çözünürlük

Şimdi işler ilginçleşmeye başlıyor. GetSystemTime() çözünürlüğünü test etmek için bir komut dosyasının kodu:

 /* Script to test Millisecond Resolution via GetSystemTime ()

Windows struct for a GetSystemTime() or GetLocalTime() call:
typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wDay;
  WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
*/

// MT4 equivalent struct:
struct _SYSTEMTIME {
   ushort wYear;         // 2014 etc
   ushort wMonth;         // 1 - 12
   ushort wDayOfWeek;     // 0 - 6 with 0 = Sunday
   ushort wDay;           // 1 - 31
   ushort wHour;         // 0 - 23
   ushort wMinute;       // 0 - 59
   ushort wSecond;       // 0 - 59
   ushort wMilliseconds; // 0 - 999
};

#import "kernel32.dll"
void GetSystemTime(_SYSTEMTIME &time);
#import

void OnStart () {
  _SYSTEMTIME st;
  GetSystemTime(st);
   int startMsecs = st.wMilliseconds, nowMsecs;
   for ( int j= 0 ; j< 1000000000 ; j++) {
    GetSystemTime(st);
     if (st.wMilliseconds != startMsecs) {
      nowMsecs = st.wMilliseconds;
       if (nowMsecs < startMsecs)
        nowMsecs += 1000 ; // wMilliseconds wrapped
       MessageBox ( StringFormat ( "GetSystemTime msecs %d -> %d diff %d" , startMsecs, nowMsecs, nowMsecs - startMsecs), "Test Millisecond Resolution via GetSystemTime" );
       return ;
    }
  }
}

Bu, başka hiçbir yazılımın çalışmadığı yeni başlatılmış bir bilgisayarda 15/16 msn, ancak bilgisayarda Chrome çalışıyorsa 1 msn çözünürlük sağlar! Angevoyageur'un ikinci bağlantısının açıkladığı gibi, Chrome, diğer bazı yazılımlarda olduğu gibi sistem zamanlayıcısını 1 msn çözünürlüğe ayarlar.

Sistem zamanlayıcı çözünürlüğünü ayarlamak için iki küçük yardımcı program buldum, böylece temiz önyüklemeli bir makinede kontrollü bir şekilde 1 msn (hatta 0,5 msn) çözünürlük elde edilebilir:

Windows Sistem Zamanlayıcı Aracı: http://vvvv.org/contribution/windows-system-timer-tool

Zamanlayıcı Çözünürlüğü: http://www.lucashale.com/timer- Resolution/

İkisinden ilkini, Windows Sistem Zamanlayıcı Aracını tercih ederim. Bununla GetSystemTime() aracılığıyla güvenilir bir şekilde 1 msn çözünürlük elde edebilirim. GetLocalTime() da benzer şekilde kullanılabilir.

Btw, yukarıdaki komut dosyası kodu, yapılar sayesinde yeni MT4 kodunun ne kadar iyi olabileceğinin bir örneğidir. Eski MT4'te GetSystemTime()'a erişmek, bir tamsayı dizisinin yanı sıra çok sayıda dağınık bit manipülasyonunun kullanılmasını gerektiriyordu.

GetSystemTimeAsFileTime() Çözünürlük

Son olarak, Windows için Mikrosaniye Çözünürlük Süresi Hizmetlerinin GetSystemTimeAsFileTime()'ın sistem saatine erişmek için daha hızlı bir işlev olduğunu ve daha küçük ve daha basit bir yapı gerektirdiğini belirttiğini not ettim. "Yapı" sadece bir ulong'a indirgenebildiğinden, ikincisi yeni MT4 için kesinlikle doğrudur.

GetSystemTimeAsFileTiime() çözünürlüğünü test etmek için bir komut dosyasının kodu:

 // Script to test Millisecond Resolution via GetSystemTimeAsFileTime()

#import "kernel32.dll"
void GetSystemTimeAsFileTime( ulong &SystemTimeAsFileTime); // Returns the system time in 100 nsec units in a ulong
#import

void OnStart () {
   ulong startL, nowL;
  GetSystemTimeAsFileTime(startL);
   for ( int j= 0 ; j< 1000000000 ; j++) {
    GetSystemTimeAsFileTime(nowL);
     if (nowL > startL) {
       int diff = int (nowL - startL);
       MessageBox ( StringFormat ( "GetSystemTimeAsFileTime %llu -> %llu diff %d in 100 nsec units = %.1f msecs" ,
                 startL, nowL, diff, diff/ 10000.0 ), "Test Millisecond Resolution via GetSystemTimeAsFileTime" );
       return ;
    }
  }
}

0,5 saniyelik bir sistem zamanlayıcı çözünürlüğü ayarlamak için Windows Sistem Zamanlayıcı Aracı kullanılırsa, bu küçük komut dosyası 5000 (veya bazen 5001) 100 nsn birim = 0,5 msn bir çözünürlük bildirir.

GetSystemTimeAsFileTiime() kullanımı gerçekten daha basittir ve daha iyi çözünürlük gösterebilir.

İşte bunun kullanımda olan bazı resimleri.

Temiz bir önyüklemeden sonra:

Temiz bir önyüklemeden sonra

Sistem zamanlayıcı çözünürlüğünü 1 ms'ye ayarlamak için kullanılan Zamanlayıcı Aracı ile:

Sistem zamanlayıcı çözünürlüğünü 1 ms&#39;ye ayarlamak için kullanılan Zamanlayıcı Aracı ile

Ve sistem zamanlayıcı çözünürlüğünü 0,5 ms'ye ayarlamak için kullanılan Zamanlayıcı Aracı ile:

Sistem zamanlayıcı çözünürlüğünü 0,5 ms&#39;ye ayarlamak için kullanılan Zamanlayıcı Aracı ile

Çözüm

MT4'te milisaniye zamanlamaları elde etmek için kullanılacak en iyi işlev, istenen sistem zamanlayıcı çözünürlüğünü ayarlamak için kullanılan Windows Sistem Zamanlayıcı Aracı gibi bir yardımcı programla birlikte yukarıdaki test komut dosyasında gösterildiği gibi GetSystemTimeAsFileTiime() işlevidir.

Neden: