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:
- 56
- Derecelendirme:
- Yayınlandı:
- Güncellendi:
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
.tcs MQ dosyalarından 3,5 kata kadar daha kompakt bir biçimde depolamak için tik verilerinin sıkıştırılması. Ve onlarla hızlı çalışmak için, 3 baytı okumak 60 baytlık MqlTick yapısından daha az zaman alır.
Veri bloklarının ek ZIP sıkıştırması ile Ask, Bid, time ile 2023 için dosya boyutu ekran görüntüsünde görülebilir:

2023 için .tcs formatında dosya boyutu:

3,56 kat sıkıştırma.
Tikleri saklamak için, Alış ve Satış fiyatlarının bir önceki fiyattan farkları kullanılır. Genellikle (tüm tiklerin %50...70'ine kadar) (-8...7) puanı geçmez ve 4 bit ile kaydedilebilir. Alış ve Satış 1 baytta birleştirilir.
Artı 0 ila 255 milisaniye arasındaki zaman farkını saklamak için 1 bayt (229'a kadar olan kodda, 229'un üzerindeki değerler -8...7 puanın ötesindeki tikleri kodlamak için kullanılır).
Fiyatlar veya zamanlar daha büyük değerlerle farklılık gösteriyorsa, daha fazla sayıda bayta paketlenirler.
Ek sıkıştırma için ZIP arşivleme uygulayabilirsiniz. Verilerin boyutu 2 kata kadar azaltılır.
Alternatif olarak, -129 ila 128 arasındaki Satış ve Teklif 8 bit veya her biri 1 bayta sıkıştırılarak 3 bayta sıkıştırma yapılabilir. Artı zaman için 1 bayt - çoğu tik için toplam 3 bayt.
Bazen(https://www.mql5.com/ru/forum/499639/page6#comment_58544810), 2 bayta sıkıştırılmış tik sayısı 4 bayta sıkıştırılmış tik sayısından fazlaysa, 3 bayta sıkıştırmak daha verimli olur. Enstrüman istatistiklerine bakmanız gerekir.
Komutu ile maksimum sıkıştırmayı 3 bayt olarak değiştirebilirsiniz:
#define compressTo3Bytes // tikleri 2 yerine 3 bayta sıkıştırın.
Sıkıştırılmış biçimde depolanacak tik öğeleri
Depolama için 3 çeşit tik elemanı programlanmıştır:
- Satış, Teklif, time_msc
- Satış, Teklif, time_msc, volume_real
- Tüm öğeler Ask, Bid, Last, time_msc, volume_real, flags (int volume volume_real'den hesaplanır).
Ayrıca ZIP olarak da sıkıştırılabilirler. Toplamda 6 varyant olacaktır
method=1;//1...6 BidAsk_=1, BidAskVolume_=2, All_=3, BidAsk_Zipped=4, BidAskVolume_Zipped=5, All_Zipped=6
Sıkıştırmaya başlamadan önce, kene depolama varyantını ve hesaplamalar ve fiyatların normalleştirilmesi için kullanılan bazı standart parametreleri sınıfa aktarmanız gerekir.
TickCompressor Compressor2; double VolumeStep_=SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); Compressor2.Start(method,_Point,VolumeStep_,_Digits);
Uzman Danışman bayrak kullanıyorsa, bunlar fiyat değişikliklerinden şu komutla geri yüklenebilir
#define RestoreFlags // change ask, bid, volume'den tick bayraklarını geri yükle - tick oluşturma süresine 869ms yerine 931% ekleyecektir
Sıkıştırma testi için Uzman Danışman eklenmiştir, hız ve sıkıştırma oranı hakkında istatistikler verecektir. İçinde kenelerin sıkıştırma ve açma örneğini görebilirsiniz.
Ticaret için Uzman Danışman örneği buradan görüntülenebilir https://www.mql5.com/tr/code/65821.
2 ve 3 bayt sıkıştırma için istatistikler:
| 2 bayta sıkıştırma: | 3 bayta sıkıştırma |
| Tik: 47707712 Sıkıştırılmış boyut: 135718404 Sıkıştırılmış 2862666420 baytları 135718404 baytlarına ==> %4,74 Sıkıştırma performansı: 764 MB/s Sıkıştırma performansı: 13,4 Tik (milyon)/sn. Sıkıştırma performans kriteri: 281,7 Sıkıştırma performansı: 3550 MB/s Sıkıştırma performansı: 62,0 Tik (milyon)/sn. Sıkıştırma performansı kriteri: 1308,8 Uzman https://www istatistikleri. mql5.com/en/code/65821 BTCUSDT için -------------------- İstatistikler: -------------------- 2 bayt: %70,1, 50705359 tik 4 bayt: %17,1, 12350966 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, 197342036 bayt. Ortalama: tik başına 2.729 bayt Sıkıştırılmamış boyut: 197342036. Sıkıştırılmış boyut: 108302550. ZIP sıkıştırma: %54,9 Ortalama: tik başına 1,498 bayt EURUSD için -------------------- İstatistikler: -------------------- 2 bayt: %66,2, 29694779 tik 4 bayt: %2,3, 1022937 tik 5 bayt: %31,5, 14106637 tik 6 bayt: %0.0%, 25 tik 7 bayt: 0.0%, 8 tik 11 bayt: 0.0%, 800 tik 12 bayt: 0.0%, 3 tik 13 bayt: 0.0%, 4 tik 24 bayt: 0.0%, 1 tik Toplam: 44825194 tik, 134023609 bayt. Ortalama: tik başına 2.99 bayt Sıkıştırılmamış boyut: 134023609. Sıkıştırılmış boyut: 95495454. ZIP sıkıştırması: %71,3 Ortalama: tik başına 2,13 bayt | Tik: 47707712 Sıkıştırılmış boyut: 169378137 Sıkıştırılmış 2862462720 baytları 169378137 baytlarına ==> %5,92 Sıkıştırma performansı: 623 MB/s Sıkıştırma performansı: 10,9 Tik (milyon)/sn. Sıkıştırma performansı ölçütü: 183.9 Açma performansı: 3225 MB/s Açma performansı: 56,4 Tik (milyon)/sn. Açma performansı ölçütü: 952,6 Doğru = true Uzman İstatistikleri https://www.mql5.com/en/code/65821 BTCUSDT için -------------------- İ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: 105802525. ZIP sıkıştırması: %44,8 Ortalama: tik başına 1,463 bayt EURUSD için 3 bayt: %66,5, 29801633 tik 4 bayt: %2,0, 916083 tik 5 bayt: %31,5, 14106637 tik 6 bayt: %0,0, 25 tik 7 bayt: %0.0, 8 tik 11 bayt: %0.0, 800 tik 12 bayt: %0.0, 3 tik 13 bayt: %0.0, 4 tik 24 bayt: %0.0, 1 tik Toplam: 44825194 tik, 163611534 bayt. Ortalama: tik başına 3.65 bayt Sıkıştırılmamış boyut: 163611534. Sıkıştırılmış boyut: 96541155. ZIP sıkıştırma: %59,0 Ortalama: tik başına 2,154 bayt |
Kod örnekleri
Kene sıkıştırma
Blok blok:
int ZIPpos=0;//sıkıştırılmış bayt sayacı if(Amount>ticks_per_block){// > 1 blok - blokları tmp'den Ticks2'ye yapıştırma for(int start=0; start<Amount; start+=ticks_per_block){ Compressor2.Compress(Ticks, tmp, start, (Amount > start + ticks_per_block ? ticks_per_block : Amount - start)); ZIPpos+=ArrayCopy(Ticks2,tmp,ZIPpos); //copy to end of Ticks2 } }else{//1 blok - doğrudan Ticks2'ye açma Compressor2.Compress(Ticks, Ticks2, 0, Amount); }
Eğer 1 bloktaki tik sayısını dizideki toplam tik sayısından büyük olarak ayarlarsanız, 1 bloğa sıkıştırılacaktır.
Eğer her zaman 1 bloğa sıkıştırmaya ihtiyacınız varsa
Compressor2.Compress(Ticks,Ticks2);
Ancak bu kadar büyük veya çok büyük bir bloğun dekompresyon hızı 2 kat daha yavaş olabilir. Ayrıca büyük bir blok için büyük bir bellek tüketimi olacaktır.
Tiklerin paketten çıkarılması
Paketi açarken, paketlenmiş tik sayısının bilinmesi arzu edilir. Alıcı dizisi bu boyuta sahip olmalıdır.
ArrayResize(Ticks3,Amount); Boyut, örneğin bir dosyaya kaydedilebilir. Ve sonra paketten çıkarırken kullanın.
Boyut bilinmiyorsa, döngü içindeki boyutu bloktaki tik sayısına göre değiştirebilirsiniz
//yavaşla ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //büyük bir diziyi yeniden boyutlandırma - küçük bir bloğun üzerine yazmaktan daha yavaş çalışır
Bu kod blok blok tik alır. Yalnızca 1 büyük blok varsa, onu da doğru şekilde sayar. Keneler büyük bir dizide toplanmaz, ancak Strategy(Ticks3[j]) stratejiniz tarafından hemen işlenebilir;
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//sonraki bloğu boyutlandırın, ZIPpos'u 4 artırın uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // yeni bloğu nextSize boyutuyla tmp'ye kopyala //3 kat daha yavaş ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //büyük bir diziyi yeniden boyutlandırır - küçük bir bloğun üzerine yazmaktan daha yavaş çalışır //total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//bloku paketinden çıkarın ve Ticks3'e ekleyin. total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //bloku paketinden çıkarın ve Ticks3'te üzerine yazın ZIPpos+=nextSize; for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//strateji };
Tüm bloklardan gelen tikleri tek bir büyük dizide toplar:
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//sonraki bloğu boyutlandırın, ZIPpos'u 4 artırın uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // yeni bloğu nextSize boyutuyla tmp'ye kopyala //daha yavaş ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //büyük bir diziyi yeniden boyutlandırır - küçük bir bloğun üzerine yazmaktan daha yavaş çalışır total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//bloku paketinden çıkarın ve Ticks3'e ekleyin //total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //bloku paketinden çıkarın ve Ticks3'ün üzerine yazın ZIPpos+=nextSize; //for (int j = 0; j < ticks; j++){ Strateji(Ticks3[j]);}//strateji };
Veya bir satır. Yalnızca 1 blok kaydedilmelidir. Daha fazla ise - yukarıdaki 2 kod varyantını kullanın.
total_ticks=Compressor3.DeCompress(Ticks2,Ticks3);
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal kod: https://www.mql5.com/ru/code/66201
Titik Impas Breakeven
Tek bir işlemin stop-loss'unu açık fiyatına uyacak şekilde manuel olarak ayarlamak nispeten basit bir görev olsa da, çok sayıda pozisyonu ayrı ayrı yönetmek zahmetli ve zaman alıcı olabilir. MT4/MT5 için Titik Impas Breakeven komut dosyası, bu süreci kolaylaştırarak birden fazla pozisyonla uğraşan tüccarlar için verimlilik ve kolaylık sağlar.
Inter
Çok para birimli çoklu çerçeve göstergesi.