Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Web sitesi politikasını ve kullanım şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Test senaryosunun tam anlamıyla işlevsel olması için pratik bir senaryoyu anlamam gerekiyor: sadece milisaniye hassasiyetinde zamanları çakışan tiklere göre işlem mi yapıyoruz?
Hayır. Amaç, tüm sembollere göre her zaman güncel bir ortam sağlamak. Benim örneğimde, OnTimer'da güncellik koşulu her zaman karşılanır. Pozisyon açma işlemi sadece bir gösterim amaçlıdır.
Tamam.
OnTickMulti olayındaki uygulamanın nerede bir tik “kaybettiği”, başka bir deyişle, SymbolInfoTick'in beklenen fiyatları döndürmemesi nasıl oluyor (daha önce, göstergeden gelen özel olayların işlenmesinden kaynaklanan bir gecikme olabileceğini varsaymıştım) - Deneyin saflığı için casus gösterge olmadan test ederdim - en azından aynı zaman damgası için normal OnTick'ten tüm sembollere SymbolInfoTick/CopyTicks'i kullanırdım.
OnTimer'a gelince, bu konuda bazı sorularım var (yanlışım varsa düzeltin lütfen):
İşleyicinin bir milisaniyeden daha hızlı çalışacağına dair bir garantimiz yok, bu nedenle sayacın basitçe artırılması, başlangıçtaki senkronizasyonun korunacağını garanti etmez, yani sunucu zamanıyla eşleştirme, her seferinde (pozisyon açıldıktan sonra veya artırımdan daha karmaşık diğer hesaplamalar yapıldıktan sonra, eğer varsa) anında doğru bir şekilde yapılmalıdır. Başka bir deyişle, çok sayıda pozisyon açılması gerektiğinde, burada sunulan bu rafine yaklaşım işe yaramayacaktır.
Ayrıca, başlangıç senkronizasyonu (sayaçın başlatılması) da bence %100 kusursuz değil.
Diyelim ki test ortamında sunucu saati gerçekten milisaniye olmadan başlıyor, ama böyle bir kod çevrimiçi ortamda nasıl çalışacak? Ve neden 1 milisaniye ekliyoruz? Ben yine de sunucu saatini tiklerden alırdım.
Bunlar titizlik değil, sadece “güncellik koşulunun her zaman yerine getirilmesi” konusundaki şüphelerim.
Sayıcının basit bir artış, başlangıçtaki senkronizasyonun korunacağını garanti etmez
Test ortamında çalışır.
Peki bu kod çevrimiçi ortamda nasıl çalışacak?
Çevrimiçi ortamda böyle bir sorun yoktur, çünkü terminale gelen tüm veriler gösterge niteliğindedir: gecikmeler nedeniyle güncel değildir.
Peki neden 1 milisaniye ekliyoruz?
Çünkü ilk OnTimer, hemen değil, belirlenen aralıkta çağrılacaktır.
OnTickMulti olayındaki uygulamanın nerede bir tik "kaybettiği" ya da başka bir deyişle, SymbolInfoTick'in neden beklenen fiyatları döndürmediği henüz belirsiz
OnTickMulti kesinlikle bu durumla ilgisi yok, çünkü standart SymbolInfoTick işlevi bazı semboller için doğru tik değerini döndürürken, diğer semboller için döndürmüyor.
Bunun tek nedeni, tiklerin gönderilme sırasıdır.
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi ile ilgili forum
Kütüphaneler: OnTickMulti
fxsaber, 30.09.2025 09:24
Aynı zamanlı tikler aynı anda gelmez. Hepsi sırayla gelir. Ve eğer EURUSD'deki daha geç zamanlı tik ilk olarak geldiyse, o anda ikinci olarak gelecek olan GBPUSD'deki aynı zamanlı tik hakkında hiçbir şey bilinmez. Bu nedenle, ilk EURUSD tikinin geldiği anda, ikinci GBPUSD tiki henüz mevcut değildir; bunun yerine, bir önceki GBPUSD tikine ait veriler mevcuttur.Çünkü ilk OnTimer, hemen değil, belirlenen aralıkta çağrılacaktır.
Tüm verileri güncellemenin hızlı bir yolunu buldum.
Bu mekanizma, normal modda bile (OnTickMulti olmadan tek para birimli modda) yalnızca güncel verilerle çalışmaya olanak tanır. Örneğin, EURUSD için aynı zamana sahip birkaç tik vardır. Güncelleme, bu dizideki en son tik olan güncel tikle çalışmaya olanak tanır.
Not: Bu, özel semboller oluşturmanın bir başka nedenidir — aynı zamana sahip dizilerden sadece son tik'i geçmişe kaydetmek. Bu durumda, tek para birimi modunda güncelleme her zaman sağlanacaktır.
Ancak açılış fiyatları da aynı, her ne kadar tüm hisse senetlerinin açılış saatleri aynı olsa da.
Ve bu davranış nedeniyle bazı sistemleri düzgün bir şekilde test etmek imkânsız hale geliyor.
Açılış fiyatları modundaki test aracını hatırladım. İşin püf noktası, ismine rağmen test aracının bu modda 1 değil, 4 OHLC tik'i üretmesidir; oysa isimden sezgisel olarak 1 tik beklenir. Bu 4 kontrol noktasından, uzman danışmanlar için sadece ilk O alınır ve OnTick çağrılır; göstergeler için ise ek olarak HLC veya LHC (çubuğun yönüne bağlı olarak) için ilgili fiyatların tikleriyle birlikte OnCalculate 3 kez çağrılır. Bu üç ek nokta için zamanlar, yapay olarak çubuğun son üç saniyesine eşit olarak alınır. Sonuç olarak, casus gösterge semboller için tek bir olay yerine birkaç olay gönderir. Muhtemelen, açılış fiyatları modunu kullananların bunu dikkate alması gerekir.
Ayrıca (kitaptaki benzer casus göstergeme hata ayıklama ekleyerek) bir artefakt gözlemliyorum: önceki çubuğa ait ek sembolün tik olayı nedense yeni çubukta tekrarlanıyor, ancak daha sonra casusun OnCalculate işlevi çağrılıyor ve güncellenmiş fiyatla yeni ek sembol tikine ilişkin olay geliyor. Sonuç olarak, ek sembollerde güncel fiyata sahip olmak için olayların kendisinde zaman damgası bulunmalı ve daha önce işlenmiş olaylar tekrar işlenmemelidir. Ben bunu gönderim sırasında şu şekilde yapıyorum:
Ve alırken de (burada tek bir ek sembol örneği gösterilmiştir, çok sayıda sembol için timestamp[] dizisi gereklidir!):
Aynı milisaniye değerine sahip tikler varsa, sistem son tik yerine ilk tikle işlem yapar.
Senkronizasyonun en basit yolu