Fan sayfamıza katılın
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
- Görüntülemeler:
- 41
- Derecelendirme:
- Yayınlandı:
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
EAToMath kütüphanesi için alternatif https://www.mql5.com/tr/code/61283
Gerçek tik modunda tikleri kaydeder ve kaydedilen her tikle stratejinizi çağırarak matematik modunda okur.
Oluşturulma nedeni: MQ test cihazı, optimize edici her çalıştırıldığında her bir aracıya tik veri dosyaları yazar. Araçlardan biri ve test süresi için her biri 10GB yazan 36 aracım var - 480GB sürücüde toplam 360GB. Bu işlem her optimizasyondan önce yaklaşık 1 saat sürüyor. Tipik SSD'ler 500-1000 yazma döngüsü ömrüne sahiptir. Her seferinde 360GB yeniden yazıldığında kaynak çok hızlı bir şekilde tükenecektir. Bu kütüphane yalnızca 1 dosya yazar ve ardından 36 ajanın tamamı bu tek dosyadan veri okur. Tüm bunlar kütüphaneyi yazma nedenimizdi: sadece 1 dosya kullanıyoruz + her bir ajana veri yazmak için 1 saat tasarruf + MQ tester ve hatta gerçek tik modunda Virtual ile karşılaştırıldığında hızlanma.
Sorun, her biri kendi sürümüyle fxsaber (EAToMath'in yazarı) ile eşzamanlı olarak araştırıldı. Benim kodum benim için daha açık, bu yüzden onu kullanıyorum.
Ticaret işlemleri için MT4Orders kütüphanesi kullanılır https://www.mql5.com/tr/code/16006
Sanal ticaret için Virtual kütüphanesini kullanmak gerekir https://www.mql5.com/tr/code/22577
Ticaret sonuçlarını görüntülemek için MT4Orders QuickReport https://www.mql5.com/tr/code/47816 veya Report
Keneleri sıkıştırmak için TickCompressorhttps://www.mql5.com/tr/code/66201
Muhtemelen gereksiz keneleri kaldırmak için Control_Trade_Sessions kütüphanesi https://www.mql5.com/tr/code/48059, örneğin bir teklif oturumu bir ticaret oturumundan daha büyükse bağlanır. Tüm keneler kullanılıyorsa, yani seanslar çakışıyorsa da silinebilir.
EAToMath'ten farklılıklar:
Artıları:
- Kod daha kısa ve basittir, sadece 5 eklenti kütüphanesi vardır. Değiştirmeniz gerekirse, anlaşılması daha kolay olacaktır.
- Veriler farklı bir algoritma nedeniyle daha iyi sıkıştırılır https://www.mql5.com/tr/code/66201. Yalnızca time_msc, ask ve bid kaydedilirken - tiklerin %86'sına kadarı 3 karakterli sayılar, yani 3 bayt olarak kaydedilir. BTCUSDT 2023 için tik verilerini kaydederken tik başına ortalama boyut = 3,266 Bayt.
Hacimlerle kaydederken ortalama = 4,835 Bayt. Ve tam tik kaydederken = 8.439 Bayt. Test sonuçlarını içeren tablo aşağıdadır.
Ek olarak, yerleşik ZIP arşivlemeyi kullanabilirsiniz. Dosya boyutu 2 kat azalır. Böyle bir dosya 245 Mb alırken, 2023 için .tcs'deki dosya boyutlarının toplamı 364 Mb alır, yani sıkıştırma MQ'dan 1,5 kat daha iyidir. Ve matematik modunda tik oluşturma hızı ~2 kat daha hızlıdır. Aşağıdaki tabloya bakın. - Daha fazla kaydetme seçeneği vardır:

- Dosya, sistemde bir bağlantı yapılarak SSD veya RAM diske kaydedilebilir. Dosyalar çok fazla yer kaplayabilir ve RAM sürücü yeterli olmayabilir, bu nedenle birincil sürücüye kaydetmeyi seçebilirsiniz. SSD ve RAM okuma hızları hemen hemen aynı, SSD'nin en sık talep edilen verilerin tam kapasitesinin %5'ine kadarını önbelleğe aldığını okudum.
Okuma sırasında SSD'de biraz aşınma ve yıpranma oluyor, çünkü bellek hücrelerinin üzerine okuma yapmadan depolamaya göre daha sık yazmanız gerekiyor. Kesin rakamları bilmiyorum ama örneğin her 10 okumada ya da her 1000 okumada 1 üzerine yazma.... Ancak bu, diskin MQ test cihazı tarafından aşındırılmasına kıyasla çok az öneme sahip.
Eksileri:
- Virtual'ı kendiniz bağlamanız gerekir (talimatlar burada https://www.mql5.com/tr/code/22577), EAToMath stratejinizi Virtual'a kendisi aktaracaktır.
BidAsk varyantının hızı EAToMath ile karşılaştırılabilir. Diğer varyantlar daha yavaştır çünkü ya daha fazla veri içerirler ya da ek ZIP sıkıştırmasına sahiptirler.
Kullanım Özellikleri:
Symbol(), Digits( ) (=4), Point() (=0.0001) standart fonksiyonlarını stratejide kullanamazsınız, çünkü bunlar test edilen sembolle ilgili olmayan varsayılan değerler üretecektir. Bunların yerine, dosyadan okunan değerler üzerinde geçersiz kılınan _Symbol, _Digits, _Point kullanın. Ayrıca, kaydedilen sembolden değerler içeren yeni sabitler _TickSize ve _TickValue eklenmiştir - bunlar, mevduat para biriminde kar, komisyon ve takasların doğru hesaplanması için gereklidir.
Keneler kaydedilirken seçilen test periyodu ile çalışma sırası:
- Gerçek tiklere, gerekli enstrümana ve test tarihlerine göre test modunu seçin. Görev değişkenini Kaydet'ten birine ayarlayın ve keneleri kaydetme seçeneğini seçin. Test cihazını başlatın. Bundan sonra belirtilen klasörde tik içeren bir dosya oluşturulacaktır.
- Görev değişkenini Run_Strategy olarak ayarlayın. Daha sonra karşılaştırmak için gerçek tiklerle moddan çıkabilirsiniz. Test cihazını başlatın. Hesaplamalar dosyadan değil, gerçek tiklerle yapılır. Sonuç alın.

- Test modunu matematiksel hesaplamalara ayarlayın. Test cihazını başlatın. Hesaplamalar dosyadan alınan tiklerle yapılır. Adım 2'deki sonuçla karşılaştırın. Aynı olmalı, ancak birkaç kat daha hızlı olmalıdır.
Arşiv ile çalışma sırası:
- Geçmişteki tüm tiklerle bir arşiv oluşturun: Gerçek tiklerle test modunu, gerekli enstrümanı seçin. Test tarihlerini mevcut geçmişte <= ilk tik ile >= son tik arasında ayarlayın. Görev değişkenini Save...To_Archive seçeneklerinden birine ayarlayın ve tiklerin kaydedilmesi seçeneğini seçin. Test cihazını başlatın. Bundan sonra, belirtilen klasörde aracın adıyla bir klasör oluşturulacak ve burada her yıl için tik içeren dosyalar kaydedilecektir. Gerektiğinde son yılın üzerine yazılabilir, bu amaçla önceki yılların üzerine yazılmasını önlemek için tarihlerde yalnızca geçerli yılı seçin.
- Test modunu Matematik olarak ayarlayın. Görev değişkenini Run_Strategy_Fron_Archive olarak ayarlayın.
- MathTicker'da: tam arşiv grubunu kullanarak şunları ayarlayın:
Enstrüman - Enstrüman adına (tiklerinin depolandığı klasörün adıyla eşleşmelidir), testin başlangıç ve bitiş tarihine.

- Test cihazını başlatın. Hesaplamalar, gerekli yıllık dosyalardan alınan tiklerle yapılır. İşin bir dosya ile değil, birkaç dosya ile yapılması nedeniyle, biraz daha yavaştır, çünkü dosyaları açmak ve kapatmak zaman alır. Örneğin, 3 yıl için kene oluşturmak 1,7 saniye yerine 2,7 saniye sürecektir.
- Aşağıdaki Uzman Danışman tarafından elde edilen tiklerin toplamı, bir ilk tikin küçük bir değeri kadar farklılık gösterebilir. Gerçek tik modunda özel karakterler üzerinde test yaparken, ilk tik yalnızca Satış veya Teklif üretir (her ikisini de kaydetmediyseniz). Arşivden test ederken, her ikisi de önceki tiklerden geri yüklenir.
Çalışma hızını tahmin etmek için en basit Uzman Danışman örneği:
#property tester_no_cache #include <Forester\MathTicker.mqh> // matematik modunda ticareti bağlama input int rep=0;//Optimizasyon için tekrarlar sinput bool AddVolumes=true; void OnInit(){} void OnTick(){ static MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)){ #ifdef _MathTick_ if(MathTick.SaveTick(Tick)){ return; }//eğer keneleri kaydedersek, o zaman çıkın ve işlem yapmayın. #endif Strategy(Tick); } } double Sum = 0;int tk=0; void Strategy(MqlTick& Tick){ // en basit strateji - okuma hızını EAToMath ile karşılaştırmak için kullanılır Sum += Tick.bid+Tick.ask+(AddVolumes?Tick.volume_real:0.0); tk++; //if(tk<100){Print(Tick.time," " ",Tick.ask," ",Tick.bid," ",Tick.last," ",Tick.volume_real," ",Tick.flags);} } ulong StartTime = GetMicrosecondCount(); double OnTester(){ #ifdef _MathTick_ // MathTick ile çalıştırın - dosyadaki sembol parametrelerini tiklerle sayar. Mat modundaki testler için if(MathTick.SaveTicksEnd()){return 0;}// tikleri kaydettikten sonra dosyayı kapat ve çık if(MathTick.ReadSymbolVars()){ MathTick.Ticker();// mat modunda tüm tikleri Strategy(MqlTick &Tick)'e besleyecektir. } #endif Print("ticks: ",tk); long work_time = (long)(GetMicrosecondCount() - StartTime)/1000; //return(NormalizeDouble(work_time, 1)); // iş hızını elde etmek için ve return Sum;// hesaplama sonuçlarını karşılaştırmak için }
1 ayarı arasında geçiş yapabilirsiniz:
//#define RestoreFlags // восстановить флаги тика из изменения ask, bid, volume - добавит 7% к времени генерации тиков 931 вместо 869 мс
Keneler oluşturulurken, kenelerin sıkıştırılmasıyla ilgili istatistikler görüntülenecektir.
Aşağıda istatistiklerin, hacimlerin ve kenelerin oluşturulma zamanının çıktıları bulunmaktadır.
-----------
Hacimsiz MQtest cihazı
pass 1 döndürülen sonuç 4345830621850.311523 in 0:00:08.232
| C ZIP sıkıştırma | |
|---|---|
| AskBid. Dosya boyutu: 225 mb -------------------- İstatistikler: -------------------- 3 bayt: %86,6, 62644158 tik 4 bayt: %0,6, 412167 tik 5 bayt: %12,7, 9185484 tik 6 bayt: %0,0, 15274 tik 11 bayt: %0,1, 46214 tik 12 bayt: %0,0, 1 tik 24 bayt: %0.0, 1 tik Toplam: 72303299 tik, 236108596 bayt. Ortalama: tik başına 3,266 bayt son bakiye 0,00 USD pass 10 döndürülen sonuç 4345830621850.311523 in 0:00:01.485 normalleştirme yok pass 1 döndürülen sonuç 4345830621850.311523 in 0:00:00. 892 | AskBid_Zipped. Dosya boyutu: 106 mb -------------------- İstatistikler: -------------------- 3 bayt: %86.6, 62644158 tik 4 bayt: %0.6, 412167 tik 5 bayt: %12.7, 9185484 tik 6 bayt: %0.0%, 15274 tik 11 bayt: 0.1%, 46214 tik 12 bayt: 0.0%, 1 tik 24 bayt: 0.0%, 1 tik Toplam: 72303299 tik, 236108596 bayt. Ortalama: tik başına 3.266 bayt Sıkıştırılmamış boyut:236108596. Sıkıştırılmış boyut:111720863. ZIP sıkıştırması: %47,3 pass 10 döndürülen sonuç 4345830621850.311523 in 0:00:02.548 normalleştirme yok pass 2 döndürülen sonuç 4345830621850.311523 in 0:00:01.890 |
pass 1hacimli MQ test cihazı 0:00:07. 962'de 4345879117123.356445 sonucunu döndürdü
| C ZIP sıkıştırma | |
|---|---|
| AskBidVolume. Dosya boyutu: 333 mb -------------------- İstatistikler: -------------------- 4 bayt: %60.4, 43684907 tik 5 bayt: %1.1, 809676 tik 6 bayt: %33.5%, 24194111 tik 7 bayt: 4.9%, 3548666 tik 8 bayt: 0.0%, 7909 tik 12 bayt: 0.1%, 40022 tik 13 bayt: 0.0%, 17964 tik 14 bayt: 0.0, 2 tik 19 bayt: %0.0, 41 tik 32 bayt: %0.0, 1 tik Toplam: 72303299 tik, 349571243 bayt. Ortalama: tik başına 4.835 bayt pass 1 döndürülen sonuç 4345879117123.356445 in 0:00:02.803 normalleştirme yok pass 4 döndürülen sonuç 4345879117123.356445 in 0:00:01.659 | AskBidVolume_Zipped. Dosya boyutu: 204 mb -------------------- İstatistikler: -------------------- 4 bayt: 60.4%, 43684907 tik 5 bayt: 1.1%, 809676 tik 6 bayt: 33.5%, 24194111 tik 7 bayt: 4.9%, 3548666 tik 8 bayt: 0.0%, 7909 tik 12 bayt: 0.1%, 40022 tik 13 bayt: 0.0%, 17964 tik 14 bayt: 0.0%, 2 tik 19 bayt: 0.0%, 41 tik 32 bayt: 0.0%, 1 tik Toplam: 72303299 tik, 349571243 bayt. Ortalama: tik başına 4.835 bayt Sıkıştırılmamış boyut:349571243. Sıkıştırılmış boyut:214897079. ZIP sıkıştırma: %61,5 pass 2 döndürülen sonuç 4345879117123.356445 in 0:00:04.260 normalleştirme yok pass 2 döndürülen sonuç 4345879117123.356445 in 0:00:03.096 |
| Hepsi. Dosya boyutu: 582 mb -------------------- İstatistikler: -------------------- 8 bayt: %61,5, 44494583 tik 9 bayt: %33,5, 24194111 tik 10 bayt: %4,9, 3548666 tik 11 bayt: %0,0, 7909 tik 15 bayt: %0,1, 40022 tik 16 bayt: %0,0, 17964 tik 17 bayt: %0.0, 2 tik 22 bayt: %0.0, 41 tik 44 bayt: %0.0, 1 tik Toplam: 72303299 tik, 610166056 bayt. Ortalama: tik başına 8.439 bayt geçiş 2 döndürülen sonuç 4345879117123.356445 in 0:00:03.768 normalleştirme yok geçiş 1 döndürülen sonuç 4345879117123.356445 in 0: 00:02.256 | All_Zipped. Dosya boyutu: 245 mb -------------------- İstatistikler: -------------------- 8 bayt: %61,5, 44494583 tik 9 bayt: %33,5, 24194111 tik 10 bayt: %4,9, 3548666 tik 11 bayt: %0,0, 7909 tik 15 bayt: %0.1, 40022 tik 16 bayt: %0.0, 17964 tik 17 bayt: %0.0, 2 tik 22 bayt: %0.0, 41 tik 44 bayt: %0.0, 1 tik Toplam: 72303299 tik, 610166056 bayt. Ortalama: Tik başına 8.439 bayt Sıkıştırılmamış boyut:610166056. Sıkıştırılmış boyut:257105213. ZIP sıkıştırma: %42,1 pass 1 döndürülen sonuç 4345879117123.356445 in 0:00:05.388 normalleştirme yok pass 10 döndürülen sonuç 4345879117123.356445 in 0:00:03.936 |
Aynı yıl için .tcs dosyalarının boyutu 2023:

ZIP'li tüm varyantlar, hatta tam tik kaydetme daha kompakttır (3,5 ila 1,5 kat).
Sanal ticaret ve rapor çıktısı için Uzman Danışman örneği:
#property tester_no_cache #include <MT4Orders.mqh> // https://www.mql5.com/tr/code/16006 #include <Forester\MathTicker.mqh> // matematik modunda ticareti bağlama #define ORDER_CURRENCY_DIGITS 2 // İşlem geçmişine yerleştirildiğinde kar/komisyon/takas hesaplamak için basamak ayarı. #define VIRTUAL_LIMITS_TP_SLIPPAGE // Limitleyiciler ve TP'ler ilk kabul fiyatından gerçekleştirilir - pozitif kaymalar #define ORDER_COMMISSION -0 // Komisyon ataması = Lotlar * ORDER_COMMISSION. #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/tr/code/22577 #define REPORT_TESTER // Test cihazı raporları otomatik olarak kaydedecektir #define REPORT_BROWSER // Tarayıcı başlatma ile rapor oluşturma - DLL izni gerektirir. #define USE_highcharts //- Tüm Highcharts ürünlerini ücretsiz olarak indirebilir ve deneyebilirsiniz. Projeniz/ürününüz piyasaya sürülmeye hazır olduğunda, ticari bir lisans satın alın. https://shop.highcharts.com/ #include <MT4Orders_QuickReport.mqh>// enum VirtTyp {MQ_Tester=0,Virtual1=1,Virtual2=2}; sinput VirtTyp tester1=1;//Test 1 sinput VirtTyp tester2=2;//Test 2 input int rep=0;//Optimizasyon için tekrarlar bool isOptimization = false, isTester=false; double balInit=0; VIRTUAL_POINTER Virtual[10]; void OnInit(){ Virtual[0] = 0; // 0 - gerçek ticaret ortamı Virtual[1] = VIRTUAL::Create(AccountBalance()); // Sanallaştırma oluşturuldu 1. Virtual[2] = VIRTUAL::Create(AccountBalance()); // Sanallaştırma oluşturuldu 2. //Virtual[tester1].Select(); isOptimization = MQLInfoInteger(MQL_OPTIMIZATION) ; isTester = MQLInfoInteger(MQL_TESTER); balInit=AccountBalance(); } void OnTick(){ //Virtual[0].Select(); VIRTUAL::NewTick();// tik işaretini geçerli sanal makineye gönder static MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)){ #ifdef _MathTick_ if(MathTick.SaveTick(Tick)){ return; }//ticks yazıldığında fonksiyondan çıkılacak, Strategy() çağrılmayacaktır #endif Strategy(Tick);//ticaret } } void Strategy(MqlTick& Tick){ // en basit strateji - okuma hızını EAToMath ile karşılaştırmak için kullanılır if(Tick.ask==0 || Tick.bid==0){return;}//MQ test cihazı başarısız bir tik üzerinde işlem yapar, Virtual yapmaz. MQ için de yasak if(tester1>0){Virtual[tester1].Select(); VIRTUAL::NewTick(Tick);}//sanallaştırma 1'i seçin ve bir onay işareti gönderin if(tester2>0){Virtual[tester2].Select(); VIRTUAL::NewTick(Tick);}//sanallaştırma 2'yi seçin ve bir onay işareti gönderin if(isNewHour(Tick.time)){//her saatin ilk tik'i if(GetHour0(Tick.time) % 2==0){// tester 1'de çift saatlerde satın alın Virtual[tester1].Select();//sanallaştırmayı seç 1 OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, Tick.ask - 100 * _Point, Tick.ask + 100 * _Point); }else{//tester 2'de tuhaf saatlerde satış Virtual[tester2].Select();//sanallaştırma 2'yi seçin OrderSend(_Symbol, OP_SELL, 1, Tick.bid, 0, Tick.bid + 100 * _Point, Tick.bid - 100 * _Point); } } } double OnTester(){ #ifdef _MathTick_ // MathTick ile çalıştırın - sembol parametrelerini tick dosyasından okuyacaktır. Mat modundaki testler için if(MathTick.SaveTicksEnd()){return 0;}//ticks kaydettikten sonra geri dön if(MathTick.isMath && MathTick.ReadSymbolVars()){ if(tester1==0){Alert(" >>>>>>>>> Virtual tester 1=MQ. In math mode can be used only virtual tester. <<<<<<<<");return 0;} if(tester2==0){Alert(" >>>>>>>>> Virtual tester 1=MQ. In math mode can be used only virtual tester. <<<<<<<<");return 0;} SYMBOL_BASE sb; sb.Point=_Point; sb.Digits=_Digits; sb.Symbol=_Symbol; sb.SymbolID=0; sb.TickSize=_TickSize; sb.TickValue=_TickValue / _TickSize;//this.TickValue_ /= this.TickSize_; //fxsaber\Virtual\Symbol_Base.mqh dosyasındaki SetSymbol() işlevinde olduğu gibi Virtual[1].Select(); VIRTUAL::SetSymbolBase(sb); Virtual[2].Select(); VIRTUAL::SetSymbolBase(sb); //minFreezeLevel = _minFreezeLevel*_Point; minStopLevel = _minStopLevel*_Point; Virtual[tester1].Select(); MathTick.Ticker();// mat modunda tüm tikleri Strategy(MqlTick &Tick)'e besleyecektir. } #endif double ret_val=0; for (int v = 0 ; v <= VIRTUAL::Total(); v++){ if(Virtual[v].Select()){ if(v > 0){ VIRTUAL::Stop(); #ifdef _MathTick_ // MathTick ile çalıştırın - sembol parametrelerini tick dosyasından okuyacaktır. Mat modundaki testler için if(MathTick.isMath){ VIRTUAL::CalcSwaps( MathTick.swapShort, MathTick.swapLong, 0, MathTick.swap3days ); }//kene dosyasından değiştirir else{VIRTUAL::CalcSwaps( _Symbol, 0 );} #else VIRTUAL::CalcSwaps( _Symbol, 0 );//takasları hesapla - tüm işlemlerin bir takası vardır, yani 2+ farklı enstrüman varsa, her ikisi de ana sembolün takasına sahip olacaktır. #endif }// test cihazında olduğu gibi tamamlanmamış işlemleri son tik fiyatından kapatın if( !isOptimization){QuickReport("report_"+(string)v, true, v,false,true);} Print((string)v+" AccountBalance = ",AccountBalance(), " AccountEquity = ",AccountEquity()); double prib=AccountBalance()-balInit; ret_val += prib; // }} return ret_val;// hesaplama sonuçlarını karşılaştırmak için } bool isNewHour (datetime &t){ static int next_h=-1; if(t < next_h){ return false; } else { next_h = (GetHour0(t)+1)*3600;return true;}} int GetHour0 (datetime &t){return((int)( t / 3600));}//1 Ocak 1971'den itibaren geçerli saat
Bu örnek, farklı ticarete sahip 2 sanal makine oluşturur. Çift saatlerde bir test cihazı satın alıyor, diğeri tek saatlerde satıyor.
Bu 2 test cihazı ile karmaşık bir örnektir, tek bir test cihazı ile çalışmanız gerekiyorsa basitleştirilebilir.
Ayrıca MQ test cihazını seçebilir ve hesaplamaların doğruluğunu kontrol etmek için sanal test cihazlarının sonuçlarıyla karşılaştırabilirsiniz. Yalnızca komisyon çakışmayabilir, çünkü birçok farklı komisyon vardır ve sanal test cihazında yalnızca bir varyant programlanmıştır.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal kod: https://www.mql5.com/ru/code/65821
EMA_ATR_VA
Uyarlanabilir Üstel Hareketli Ortalama - ATR Volatilitesi Jose Silva tarafından ATR göstergesine göre ayarlanmıştır.
EMA_STD_VA
Standart sapmanın değerine bağlı olarak uyarlanabilir üstel ortalama.
SAR ADX Signal
Mobil bildirimli SAR ADX Sinyali, MT4 sürümünden yeniden yazılmıştır (kaynak artık bulunamadı). Bu yeniden boyanabilir bir göstergedir, lütfen kullanırken dikkatli olun.
EMA_BB_VA
Uyarlanabilir (Bollinger Bantlarına bağlı) Üstel Hareketli Ortalama (Jose Silva tarafından ayarlanan BB Volatilitesi).